博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CF625E】Frog Fights(模拟)
阅读量:5080 次
发布时间:2019-06-12

本文共 1410 字,大约阅读时间需要 4 分钟。

【CF625E】Frog Fights(模拟)

题面

翻译:

\(n\)只青蛙在一个被分为了\(m\)等分的圆上,对于每份顺时针依次标号。
初始时每只青蛙所在的位置是\(p_i\),速度是\(a_i\)
然后从\(1\)号青蛙开始,顺次移动,每只青蛙顺时针移动\(a_i\)个格子。
途中碰到的所有青蛙都会被他淘汰。
如果它淘汰了\(x\)只青蛙,那么它的速度会变为\(a_i-x\)
求最终剩下的青蛙数量以及编号。

题解

发现在没有淘汰的情况下,所有青蛙的相对位置是不会发生变化的。

那么,我们按照所有青蛙所在的位置依次排序,计算一下它淘汰前面那只青蛙的时间。
把所有的这个时间全部丢到\(set\)里面去。
每次显然是把时间最小的那次淘汰给从\(set\)中取出来,
淘汰对应的青蛙,并且更新一下状态就好了。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long long#define RG register#define MAX 111111#define inf 1e9inline int read(){ RG int x=0,t=1;RG char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t;}int p[MAX],a[MAX],n,m,q[MAX],nt[MAX],lt[MAX];set
>S;bool cmp(int a,int b){return p[a]
u=*S.begin();if(u.first==inf)break; int v=u.second;S.erase(S.begin()); S.erase(make_pair(calc(nt[v],nt[nt[v]]),nt[v])); if(!S.empty())S.erase(make_pair(calc(lt[v],v),lt[v])); p[v]+=u.first;p[v]%=m;--a[v]; nt[v]=nt[nt[v]];lt[nt[v]]=v; S.insert(make_pair(calc(lt[v],v),lt[v])); S.insert(make_pair(calc(v,nt[v]),v)); } printf("%d\n",S.size()); for(set
>::iterator it=S.begin();it!=S.end();++it)printf("%d ",it->second); puts("");return 0;}

转载于:https://www.cnblogs.com/cjyyb/p/9254445.html

你可能感兴趣的文章
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
django Models 常用的字段和参数
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
关于indexOf的使用
查看>>
英语单词
查看>>
Mongo自动备份
查看>>
cer证书签名验证
查看>>
新手Python第一天(接触)
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>