题目连接:652F - Ants on a Circle

题目大意:\(n\)个蚂蚁在一个大小为\(m\)的圆上,每个蚂蚁有他的初始位置及初始面向,每个单位时间蚂蚁会朝着当前面向移动一个单位长度,在遇到其它蚂蚁时会立刻掉头。求经过\(t\)个单位时间后每一个蚂蚁的所在位置

题解:首先可以发现,最终答案其实是在不考虑碰撞下得出答案的一个排列,而且蚂蚁们的相对位置是不会改变的。所以如果求出了其中任意一个蚂蚁的位置,就能求出最终的答案。

   为了方便起见,先默认所有蚂蚁的位置是按升序排的,且第一个蚂蚁的位置为\(0\)

   对于碰到同伴就掉头这个情况,可以换一种视角来考虑,即碰到同伴时,不掉头,而是交换相遇两蚂蚁的编号,这样子做从结果上看二者并没有差别

   对于所有蚂蚁,就以第一个蚂蚁为例,假设其初始面向是向右,则当他遇到其他蚂蚁时,会和他右边的蚂蚁交换编号。又由蚂蚁们的相对位置不变,可以得出他右边蚂蚁的编号始终是比他自己大\(1\)的,因此可以得出,每次碰撞带来的后果就是使其编号加一。又因为在走过一圈后,所有的蚂蚁都回到了初始的位置,且面向未发生改变,所以每一圈编号的变化量是固定的。所以可以得出在经过\(t\)时间后,该蚂蚁的编号发生了多少改变,并与该蚂蚁的最终位置相匹配即可。

   这种做法存在一种问题就是,若这个蚂蚁的最终位置与其他蚂蚁的位置重复,则无法确定他具体在哪个编号上。这时可以找出那个和该蚂蚁终点相同的蚂蚁,再做一遍相同的操作,比较下两个蚂蚁的编号就好了。

   虽然代码看上去很长,但实际上\(f**k()\)里的内容都是照抄下面的东西,写起来还是挺简单的

#include<bits/stdc++.h>
using namespace std;
#define N 600001
#define LL long long
#define mp make_pair
LL n,m,t,d,x,mn,cnt,b[N],r[N],r2[N],f[N],ans[N];
pair<LL,LL>a[N];
bool cmp(LL x,LL y){return a[x]<a[y];}
bool cmp2(LL x,LL y){return f[x]<f[y];}
LL get()
{
char ch=getchar();
while(ch!='L' && ch!='R')
ch=getchar();
return ch=='L'?-:;
}
void fuck()
{
for(LL i=;i<n;i++)
f[i]=(a[i].first+(t%m)*(m+a[i].second))%m;
LL X=;
for(LL i=;i<n;i++)
if(f[i]==f[])X=i;
LL c=a[X].first;
for(LL i=;i<n;i++)
a[i].first=(a[i].first+m-c)%m;
sort(a,a+n);
cnt=;
for(LL i=;i<n;i++)
if(a[i].second!=a[].second)
{
b[cnt++]=a[i].first;
b[cnt++]=a[i].first+m;
}
sort(b,b+cnt);
for(LL i=;i<n;i++)
f[i]=(a[i].first+(t%m)*(m+a[i].second))%m;
LL dd=lower_bound(b,b+cnt,f[]*)-b;
if(b[dd]==f[]* && a[].second>)dd++;
if(a[].second< && f[])dd=cnt-dd;
dd+=cnt*((t/m)%n),dd%=n;
if(a[].second<)dd=(n-dd)%n;
for(LL i=;i<n;i++)
a[i].first=(a[i].first+c)%m;
for(LL i=;i<n;i++)
f[i]=(a[i].first+(t%m)*(m+a[i].second))%m;
sort(f,f+n);
if((d+)%n==(dd+X)%n && f[x]==f[(x+n-)%n])x=(x+n-)%n;
if(d==(dd+X+)%n && f[x]==f[(x+)%n])x=(x+)%n;
}
int main()
{
scanf("%I64d%I64d%I64d",&n,&m,&t);
for(LL i=;i<n;i++)
{
r[i]=r2[i]=i;
scanf("%I64d",&a[i].first);
a[i].second=get();
}
sort(r,r+n,cmp);
sort(a,a+n);
mn=a[].first;
for(LL i=;i<n;i++)
a[i].first-=mn;
for(LL i=;i<n;i++)
if(a[i].second!=a[].second)
{
b[cnt++]=a[i].first;
b[cnt++]=a[i].first+m;
}
sort(b,b+cnt);
for(LL i=;i<n;i++)
f[i]=(a[i].first+(t%m)*(m+a[i].second))%m;
d=lower_bound(b,b+cnt,f[]*)-b;
if(b[d]==f[]* && a[].second>)d++;
if(a[].second< && f[])d=cnt-d;
d+=cnt*((t/m)%n),d%=n;
if(a[].second<)d=(n-d)%n;
sort(r2,r2+n,cmp2);
sort(f,f+n);
for(LL i=;i<n;i++)
if(r2[i]==)x=i;
if(f[x]==f[(x+)%n] || f[x]==f[(x+n-)%n])fuck();
for(LL i=;i<n;i++)
ans[r[(d+i)%n]]=f[(x+i)%n];
for(LL i=;i<n;i++)
printf("%I64d%c",(ans[i]+mn-)%m+,i<n-?' ':'\n');
return ;
}

[Educational Round 10][Codeforces 652F. Ants on a Circle]的更多相关文章

  1. Codeforces 652F Ants on a Circle

    Ants on a Circle 感觉这个思路好巧妙啊. 我们能发现不管怎么碰撞,初始态和最终态蚂蚁间的相对顺序都是一样的, 并且所占的格子也是一样的, 那么我们就只需要 找到其中一个蚂蚁的最终位置就 ...

  2. [Educational Round 5][Codeforces 616F. Expensive Strings]

    这题调得我心疲力竭...Educational Round 5就过一段时间再发了_(:з」∠)_ 先后找了三份AC代码对拍,结果有两份都会在某些数据上出点问题...这场的数据有点水啊_(:з」∠)_[ ...

  3. [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]

    这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...

  4. [Educational Round 3][Codeforces 609F. Frogs and mosquitoes]

    这题拖了快一周_(:з」∠)_就把这货单独拿出来溜溜吧~ 本文归属:Educational Codeforces Round 3 题目链接:609F - Frogs and mosquitoes 题目 ...

  5. [Educational Round 17][Codeforces 762F. Tree nesting]

    题目连接:678F - Lena and Queries 题目大意:给出两个树\(S,T\),问\(S\)中有多少连通子图与\(T\)同构.\(|S|\leq 1000,|T|\leq 12\) 题解 ...

  6. [Educational Round 13][Codeforces 678F. Lena and Queries]

    题目连接:678F - Lena and Queries 题目大意:要求对一个点集实现二维点对的插入,删除,以及询问\(q\):求\(max(x\cdot q+y)\) 题解:对每个点集内的点\(P( ...

  7. [Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]

    咸鱼了好久...出来冒个泡_(:з」∠)_ 题目连接:1107G - Vasya and Maximum Profit 题目大意:给出\(n,a\)以及长度为\(n\)的数组\(c_i\)和长度为\( ...

  8. CF - 652F Ants on a Circle

    题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了.所以我们可以直接计算出最终哪些位置上会有蚂蚁. 接下来就需要知道蚂蚁们的最 ...

  9. Educational Codeforces Round 10

    A:Gabriel and Caterpillar 题意:蜗牛爬树问题:值得一提的是在第n天如果恰好在天黑时爬到END,则恰好整除,不用再+1: day = (End - Begin - day0)/ ...

随机推荐

  1. 机器学习基石8-Noise and Error

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课,我们主要介绍了VC Dimension的概念.如果Hypothese ...

  2. oracle,mysql,sql server三大数据库的事务隔离级别查看方法

    1:mysql的事务隔离级别查看方法 mysql 最简单,执行这条语句就行:select @@tx_isolation  详情: 1.查看当前会话隔离级别 select @@tx_isolation; ...

  3. git 命令笔记

    切换 git 远程仓库HEAD分支 $ git remote set-head origin some_branch

  4. php cookie的问题

  5. 小米平板4 Plus获取Root超级权限的步骤

    小米平板4 Plus有么好方法开启Root权限?大家都清楚,Android机器有Root权限,一旦手机开启root相关权限,就可以实现更强大的功能,打比方大家部门的营销部门的同事,使用个别营销应用都需 ...

  6. ios手机访问H5页面中$(document).on绑定无效问题

    1.问题描述 用amazeUI做了个手机端网站,网站头部是一个点击按钮下拉菜单,点击页面其余区域下拉菜单隐藏.在chrome模拟安卓和iOS都可以正常触发,但是在真机实测的时候,iOS上面失效了.简单 ...

  7. Spring MVC基本概念

    MVC工作原理: 模型-视图-控制器(MVC)是一个以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务逻辑从界面中解耦.通常,模型负责封装应用程序数据在视图层 ...

  8. cocos creator中粒子效果的使用

    就如同上图的星星特效一样,在触碰时产生特效,但是并不销毁节点,因为要使用很多次,因此使用节点池NodePool保存起来的. 以下是使用粒子效果使要使用到的一些基本控制函数: 我的使用:

  9. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  10. net core EF 链接mysql 数据库

    这个主要是一个demo.就在一个工程里面写的 安装MySql.Data.EntityFrameworkCore 增加DbContext 相当于程序与数据库的中间层 public class Ident ...