【AGC013C】Ants on a Circle 弹性碰撞
题目大意
一个长度为\(lm\)的环上有\(n\)只蚂蚁,告诉你每只蚂蚁的位置和朝向,每只蚂蚁会向前爬,速度为\(1m/s\),两只蚂蚁相遇后都会掉头,问你\(t\)秒后每只蚂蚁的位置。
\(n\leq 100000\)
题解
ypl大神把这个东西叫做弹性碰撞。有两个定理:
ypl定理1:如果忽略个体之间的差异, 那么每个物体的运动可以看作是独立的。
ypl定理2:如果不忽略个体之间的差异, 那么物体之间的相对顺序不会发生改变。
如果这不是一个环,而是一条直线,那就很简单了。我们可以把最终位置排序,那么最终从左到右的第\(i\)只蚂蚁回到从左到右的第\(i\)个位置上。
现在是在环上。我们要尝试找出第\(1\)只蚂蚁最终会在排序之后的哪个位置上。假设没有蚂蚁经过\(l-1\)~\(0\)这段,那么就在第一个位置上(和直线没什么区别)。每有一只蚂蚁从\(0\)逆时针走到\(l-1\),那么最终位置就会往前一位。类似的,每有一只蚂蚁总\(l-1\)顺时针走到\(0\),那么最终位置就会向后一位。
我们可以在\(O(n)\)内统计数量,在\(O(n)\)内排序(因为输入是有序的),所以总时间复杂度是\(O(n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int x[100010];
int w[100010];
int y[100010];
int n,l,t;
int x1[100010];
int x2[100010];
int x3[100010];
int x4[100010];
int t1=0,t2=0,t3=0,t4=0;
int main()
{
#ifdef DEBUG
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
scanf("%d%d%d",&n,&l,&t);
int len=t%l;
int i;
int c=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&w[i]);
if(w[i]==1)
{
c+=(t+x[i])/l;
y[i]=(x[i]+len)%l;
if(y[i]>=len)
x3[++t3]=y[i];
else
x1[++t1]=y[i];
}
else
{
c-=(t-x[i]+l-1)/l;
y[i]=(x[i]-len+l)%l;
if(y[i]>=l-len)
x4[++t4]=y[i];
else
x2[++t2]=y[i];
}
c=(c%n+n)%n;
}
for(i=1;i<=t3;i++)
x1[++t1]=x3[i];
for(i=1;i<=t4;i++)
x2[++t2]=x4[i];
int cnt=0,j=1;
i=1;
while(i<=t1||j<=t2)
{
if(j>t2||(i<=t1&&x1[i]<=x2[j]))
y[++cnt]=x1[i++];
else
y[++cnt]=x2[j++];
}
for(i=c+1;i<=n;i++)
printf("%d\n",y[i]);
for(i=1;i<=c;i++)
printf("%d\n",y[i]);
return 0;
}
【AGC013C】Ants on a Circle 弹性碰撞的更多相关文章
- 【思维题】AGC013C - Ants on a Circle
妙妙技巧题 题目描述 题目大意 一个圆环上有n只蚂蚁,它们会按照顺时针或者逆时针行走.如果有蚂蚁相遇它们就会掉头(不一定在整数时间掉转).问最后每只蚂蚁的位置. 题目分析 以前在luogu上做过一道类 ...
- [Educational Round 10][Codeforces 652F. Ants on a Circle]
题目连接:652F - Ants on a Circle 题目大意:\(n\)个蚂蚁在一个大小为\(m\)的圆上,每个蚂蚁有他的初始位置及初始面向,每个单位时间蚂蚁会朝着当前面向移动一个单位长度,在遇 ...
- Codeforces 652F Ants on a Circle
Ants on a Circle 感觉这个思路好巧妙啊. 我们能发现不管怎么碰撞,初始态和最终态蚂蚁间的相对顺序都是一样的, 并且所占的格子也是一样的, 那么我们就只需要 找到其中一个蚂蚁的最终位置就 ...
- atCoder Ants on a Circle(又是蚂蚁问题。。。)
atCoder Ants on a Circle(又是蚂蚁问题...) 传送门 题意:一个圈,蚂蚁在上面以相同的速度和不同的方向走,问t秒后它们各自的位置. 解法:和经典的蚂蚁问题一致,把相撞的情况看 ...
- AtCoder Grand Contest 013 C :Ants on a Circle
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- AT2369 Ants on a Circle (思路)
考虑到蚂蚁们的相对位置不会变化,而且,如果把“相遇后掉头”看作是“相遇后交换编号”的话,也可以得出来最后都有哪些位置有蚂蚁 然后,只要确定哪个位置是“1”就可以了 然后搞一个指针p代表原来第一个位置的 ...
- [AT2369] [agc013_c] Ants on a Circle
题目链接 AtCoder:https://agc013.contest.atcoder.jp/tasks/agc013_c 洛谷:https://www.luogu.org/problemnew/sh ...
- AtCoder Grand Contest 013 C:Ants on a Circle
题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_c 题目翻译 给你一个周长为\(L\)的圆,有\(N\)只蚂蚁在圆上爬,速度为一单位距离每秒. ...
- CF - 652F Ants on a Circle
题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了.所以我们可以直接计算出最终哪些位置上会有蚂蚁. 接下来就需要知道蚂蚁们的最 ...
随机推荐
- C. Edgy Trees
链接 [https://codeforces.com/contest/1139/problem/C] 题意 给你n个点,n-1个边,无向的.有red和black的. k表示经过这k个点.可以跨其他点 ...
- docker之导出、导入、数据搬迁
docker 导出 导入有二种,一种是备份镜像,一种备份容器.数据搬迁,最简单粗暴就是直接COPY,volume的路径就行了. 一.导出导入镜像 #导出为tar docker save #ID or ...
- p76泛函 有限维空间真子空间不可能在全空间稠密
连续函数 然后多项式函数是稠密的 多项式子空间是无穷维的 多项式空间就是在全体连续函数的线性空间中稠密 有限维子空间是闭的 多项式空间也不是有限维 2的地方说 有限维真子空间必不稠密 那是对的啊 有 ...
- NET 使用 RabbitMQ
NET 使用 RabbitMQ 前言 最近项目要使用RabbitMQ,园里里面已经有很多优秀的文章,Rabbitmq官网也有.net实例.这里我尝试下图文并茂之形式记录下使用的过程. 安装 Rabbi ...
- rbac权限+中间件
1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or Flase 2.版本 ...
- Shell脚本1
1Shell编程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell脚本 Shell 脚本(shell scr ...
- Azure系列2.1.10 —— CloudBlobClient
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- mysql5.7 的 user表的密码字段从 password 变成了 authentication_string
来源: http://www.zhimengzhe.com/shujuku/other/267631.html 感觉还是挺坑的 自己没了解清楚 就动手 转帖一下 mark 一下. 1.首先停止正在运行 ...
- QueryRunner 错误
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource()); 写成了 QueryRunner qr = new QueryRunner(); 导 ...
- C# Note5:使用相对路径读取文件
一.C#中使用相对路径读取配置文件 一般Solution的目录结构如下图所示: (如过看不到某些文件,可以点击 “显示所有文件” 图标) 方法一:由于生成的exe文件在bin\debug目录下,可以使 ...