zoukankan      html  css  js  c++  java
  • AT2369 Ants on a Circle (思路)

    考虑到蚂蚁们的相对位置不会变化,而且,如果把“相遇后掉头”看作是“相遇后交换编号”的话,也可以得出来最后都有哪些位置有蚂蚁

    然后,只要确定哪个位置是“1”就可以了

    然后搞一个指针p代表原来第一个位置的蚂蚁现在的位置(相对于0来说的),每当有蚂蚁穿过0位置,p就根据穿过的方向加加减减就可以了

     1 #include<bits/stdc++.h>
     2 #include<tr1/unordered_map>
     3 #define CLR(a,x) memset(a,x,sizeof(a))
     4 #define MP make_pair
     5 #define fi first
     6 #define se second
     7 using namespace std;
     8 typedef long long ll;
     9 typedef unsigned long long ull;
    10 typedef long double ld;
    11 typedef pair<int,int> pa;
    12 const int maxn=1e5+10;
    13 
    14 inline ll rd(){
    15     ll x=0;char c=getchar();int neg=1;
    16     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
    17     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    18     return x*neg;
    19 }
    20 
    21 int L,N,x[maxn],dir[maxn],y[maxn],rnk[maxn],T,ans[maxn];
    22 
    23 inline bool cmp(int a,int b){return x[a]<x[b];}
    24 
    25 int main(){
    26     //freopen("","r",stdin);
    27     N=rd(),L=rd(),T=rd();
    28     for(int i=1;i<=N;i++) x[i]=rd(),dir[i]=(rd()==1?1:-1),rnk[i]=i;
    29     sort(rnk+1,rnk+N+1,cmp);
    30     ll p=0;
    31     for(int i=1;i<=N;i++){
    32         y[i]=((x[i]+T*dir[i])%L+L)%L;
    33         if(dir[i]==1) p+=ceil(1.0*(T-(L-x[i])+1)/L);
    34         else p-=ceil(1.0*(T-x[i])/L);
    35         // printf(":%d
    ",p);
    36     }
    37     p=(p%N+N)%N;
    38     sort(y+1,y+N+1);
    39     for(int i=p+1;i<=N;i++) ans[rnk[i-p]]=y[i];
    40     for(int i=1;i<=p;i++) ans[rnk[N+i-p]]=y[i];
    41     for(int i=1;i<=N;i++) printf("%d
    ",ans[i]);
    42     return 0;
    43 }
  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/Ressed/p/10585277.html
Copyright © 2011-2022 走看看