【CF625E】Frog Fights(模拟)

题面

CF

洛谷

翻译:

有\(n\)只青蛙在一个被分为了\(m\)等分的圆上,对于每份顺时针依次标号。

初始时每只青蛙所在的位置是\(p_i\),速度是\(a_i\)。

然后从\(1\)号青蛙开始,顺次移动,每只青蛙顺时针移动\(a_i\)个格子。

途中碰到的所有青蛙都会被他淘汰。

如果它淘汰了\(x\)只青蛙,那么它的速度会变为\(a_i-x\)

求最终剩下的青蛙数量以及编号。

题解

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

那么,我们按照所有青蛙所在的位置依次排序,计算一下它淘汰前面那只青蛙的时间。

把所有的这个时间全部丢到\(set\)里面去。

每次显然是把时间最小的那次淘汰给从\(set\)中取出来,

淘汰对应的青蛙,并且更新一下状态就好了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 111111
#define inf 1e9
inline 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<pair<int,int> >S;
bool cmp(int a,int b){return p[a]<p[b];}
int calc(int x,int y)
{
if(x==y)return inf;
int d=(p[y]-p[x]+m)%m;
if(y<x)d=(d+a[y])%m;
if(d<=a[x])return 1;
if(a[x]<=a[y])return inf;
return (d-a[y]-1)/(a[x]-a[y])+1;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)p[i]=read()-1,a[i]=read(),q[i]=i;
sort(&q[1],&q[n+1],cmp);
for(int i=1;i<=n;++i)nt[q[i]]=q[i+1],lt[q[i]]=q[i-1];
nt[q[n]]=q[1];lt[q[1]]=q[n];
for(int i=1;i<=n;++i)S.insert(make_pair(calc(i,nt[i]),i));
while(233)
{
pair<int,int> 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<pair<int,int> >::iterator it=S.begin();it!=S.end();++it)printf("%d ",it->second);
puts("");return 0;
}

【CF625E】Frog Fights(模拟)的更多相关文章

  1. CF625E Frog Fights

    有\(n\)只青蛙在一个长度为\(m\)的环上打架:每只青蛙有一个初始位置\(p_i\),和一个跳跃数值\(a_i\).从\(1\)号青蛙开始按序号循环行动,每次若第\(i\)只青蛙行动,则它会向前跳 ...

  2. Codeforces Round #342 (Div. 2) E. Frog Fights set 模拟

    E. Frog Fights 题目连接: http://www.codeforces.com/contest/625/problem/E Description stap Bender recentl ...

  3. Codeforces Round #342 (Div 2) 解题报告

    除夕夜之有生之年CF第一场 下午从奶奶家回到姥姥家,一看还有些时间,先吃点水果陪姥姥姥爷聊了会儿,再一看表,5:20....woc已经开场20分钟了...于是抓紧时间乱搞.. **A. Guest F ...

  4. HDU 5926 Mr. Frog's Game 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)

    Mr. Frog's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. HDU 5924 Mr. Frog’s Problem 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)

    Mr. Frog's Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  6. Mr. Frog’s Game(模拟连连看)

    Description One day, Mr. Frog is playing Link Game (Lian Lian Kan in Chinese). In this game, if you ...

  7. POJ - 1054 The Troublesome Frog 模拟 枚举优化。

    题意:有个R*C的格网.上面有若干个点,这些点可以连成一些直线,满足:这些点在直线上均匀排布(也就是间隔相等),直线的两段穿过网格(也就是第一个,最后一个在网格的边界附近) 求某条直线上最多的点数 题 ...

  8. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  9. HDU 5918 KMP/模拟

    Sequence I Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入和Line in输入

    1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_ ...

  2. bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)

    bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...

  3. Python中的矩阵操作

    Numpy 通过观察Python的自有数据类型,我们可以发现Python原生并不提供多维数组的操作,那么为了处理矩阵,就需要使用第三方提供的相关的包. NumPy 是一个非常优秀的提供矩阵操作的包.N ...

  4. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  5. python基础数据类型补充

    python_day_7 一. 今日主要内容: 1. 补充基础数据类型的相关知识点 str. join() 把列表变成字符串 列表不能再循环的时候删除. 因为索引会跟着改变 字典也不能直接循环删除.把 ...

  6. stl源码分析之priority queue

    前面两篇介绍了gcc4.8的vector和list的源码实现,这是stl最常用了两种序列式容器.除了容器之外,stl还提供了一种借助容器实现特殊操作的组件,谓之适配器,比如stack,queue,pr ...

  7. leetcode26_C++删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  8. 使用qemu启动dd制作的img镜像

    1. 准备工作 应用场景 在需要单机取证时,需要在不影响对象业务的情况下进行取证或分析,可以使用dd 对目标服务器进行镜像,生成img文件,镜像可以通过winhex进行静态分析.但是想要动态分析服务器 ...

  9. Team Work总结 && OPP课程总结

    团队作业总结 工作总结 本次大作业我在团队内的工作是:根据框架构建实现建筑类的功能,包括防御塔.水晶.泉水等建筑.根据架构框架以及结合各建筑的特点,利用继承和多态很快速的解决了一些基本的问题.然而在实 ...

  10. C#高级编程 (第六版) 学习 第七章:委托和事件

    第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...