当前位置: 代码迷 >> 综合 >> 【分析】AGC013C Ants on a Circle
  详细解决方案

【分析】AGC013C Ants on a Circle

热度:48   发布时间:2023-09-27 05:39:22.0

分析:

首先,这题和原本的类型是一样的,仍然是考虑编号交换。

有一个结论:
如果编号为i的蚂蚁遇到了X个逆向的蚂蚁,那么它的编号就会变为i+X

所以就可以水过去了。

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define SF scanf #define PF printf #define MAXN 100010 using namespace std; typedef long long ll; ll n,d,t; ll dir[MAXN],pos[MAXN]; ll a[MAXN],b[MAXN],cnta,cntb; ll find1(ll l,ll r){
     return upper_bound(b+1,b+1+cntb,r)-lower_bound(b+1,b+1+cntb,l); } ll find2(ll l,ll r){
     return upper_bound(a+1,a+1+cnta,r)-lower_bound(a+1,a+1+cnta,l); } ll ans[MAXN]; int main(){
     SF("%lld%lld%lld",&n,&d,&t);t*=2ll;for(int i=1;i<=n;i++){
     SF("%lld%lld",&pos[i],&dir[i]);if(dir[i]==1)a[++cnta]=pos[i];elseb[++cntb]=pos[i];}ll t1=t/d;ll t2=t%d;for(int i=1;i<=n;i++){
     if(dir[i]==1){
     ll cnt=t1*cntb;ll l=pos[i];ll r=(pos[i]+t2)%d;if(r<l)cnt+=find1(l,d-1)+find1(0,r);elsecnt+=find1(l,r);ans[(i+cnt-1)%n+1]=(pos[i]+t/2ll)%d;}else{
     ll cnt=t1*cnta;ll r=pos[i];ll l=(pos[i]-t2+d)%d;if(r<l)cnt+=find2(l,d-1)+find2(0,r);elsecnt+=find2(l,r);ans[((i-cnt)%n+n-1)%n+1]=((pos[i]-t/2ll)%d+d)%d;}}for(int i=1;i<=n;i++)PF("%lld\n",ans[i]); } 
  相关解决方案