有\(n\)只青蛙在一个长度为\(m\)的环上打架;每只青蛙有一个初始位置\(p_i\),和一个跳跃数值\(a_i\)。从\(1\)号青蛙开始按序号循环行动,每次若第\(i\)只青蛙行动,则它会向前跳 \(a_i\)个格子,撞飞它遇见的所有青蛙,包括终点格子上的,之后它的\(a_i\)减少等同于撞飞的青蛙只数,若\(a_i<0\),它不会移动。求最后剩下的所有青蛙的编号。\(n\leq 10^5,m\leq 10^9\),\(p\)互不不同


这类问题就往相对位置的方向想吧,,,

在第一次有青蛙撞飞其他青蛙之前,他们的相对位置都是不变的。所以考虑优化最朴素的模拟,即维护出第一次撞飞别人是什么时候以及哪只青蛙撞。所以一个优化的算法就是撞飞一只青蛙之后重新计算所有青蛙的位置。又由于每个青蛙只需要注意它正前方的那只,所以我们可以做一个链表来维护青蛙的相对位置。这样复杂度还是很高。但可以发现撞飞别人以后仍然有很多青蛙的相对位置没有变。如果我们每次都通过\(初始距离之差/a之差\)来计算青蛙相撞的时间,当某只青蛙撞完别人并且a减1之后,我们仍然用这个公式算就会有误差。假设这只青蛙在\(t\)时刻撞了别人,可以发现我们让它的位置往前挪\(t\)个单位就可以消除这个误差。所以我们就有一个新的算法,即每次相撞后修改一下撞击者的位置。这样就是\(O(nlogn)\)了。

#include<bits/stdc++.h>
#define rg register
#define il inline
#define cn const
#define gc getchar()
#define fp(i,a,b) for(rg int i=(a),ed=(b);i<=ed;++i)
#define fb(i,a,b) for(rg int i=(a),ed=(b);i>=ed;--i)
#define mp make_pair
using namespace std;
typedef cn int cint;
typedef pair<int,int> pr;
il int rd(){rg int x(0),f(1); rg char c(gc);while(c<'0'||'9'<c){if(c=='-')f=-1;c=gc;}while('0'<=c&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=gc;return x*f;
}
cint maxn=1e5+10,inf=0x3f3f3f3f;
int n,m,pre[maxn],nxt[maxn];
set<pr> st;
struct frog{int p,a,id;}a[maxn];
il bool cmp(cn frog &a,cn frog &b){return a.p<b.p;}
il bool cmp2(cn frog &a,cn frog &b){return a.id<b.id;}
il int calc(int x,int y){frog p=a[x],q=a[y];rg int res=0;if(x<y){rg int tmp=p.p,now=tmp+p.a,now2=q.p;p.p=(p.p+p.a-1)%m+1,res=1;if(now2<tmp)now2+=m;if(tmp<=now2&&now2<=now)return 1;}rg int dis=(q.p-p.p+m)%m,dec=p.a-q.a;if(dec<=0)return inf;return res+(dis+dec-1)/dec;
}
int main(){n=rd(),m=rd();fp(i,1,n)a[i].p=rd(),a[i].a=rd(),a[i].id=i;sort(a+1,a+1+n,cmp);pre[a[1].id]=a[n].id,nxt[a[1].id]=a[2].id,nxt[a[n].id]=a[1].id,pre[a[n].id]=a[n-1].id;fp(i,2,n-1)pre[a[i].id]=a[i-1].id,nxt[a[i].id]=a[i+1].id;sort(a+1,a+1+n,cmp2);fp(i,1,n)st.insert(mp(calc(i,nxt[i]),i));int fl=0;while(st.size()){set<pr>::iterator it=st.begin();if(it->first==inf)break;rg int i=it->second,tem=it->first;st.erase(it);st.erase(mp(calc(nxt[i],nxt[nxt[i]]),nxt[i]));st.erase(mp(calc(pre[i],i),pre[i]));--a[i].a,a[i].p=(a[i].p+tem-1)%m+1;pre[nxt[nxt[i]]]=i,nxt[i]=nxt[nxt[i]];st.insert(mp(calc(pre[i],i),pre[i]));st.insert(mp(calc(i,nxt[i]),i));}printf("%d\n",st.size());for(auto &x:st)printf("%d ",x.second);return 0;
}

CF625E Frog Fights相关推荐

  1. hdu 5037 Frog 贪心 dp

    哎,注意细节啊,,,,,,,思维的严密性..... 11699193 2014-09-22 08:46:42 Accepted 5037 796MS 1864K 2204 B G++ czy Frog ...

  2. Frog Jumps CodeForces - 1324C(二分)

    There is a frog staying to the left of the string s=s1s2-sn consisting of n characters (to be more p ...

  3. atcoder A - Frog 1(DP)

    A - Frog 1 Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement There a ...

  4. 华为抓取错误日志在哪里_抓取网址进行分析爬虫工具Screaming Frog SEO Spider for Mac...

    Screaming Frog SEO Spider for Mac是一款专门用于抓取网址进行分析的网络爬虫开发工具,你可以通过这款软件来快速抓取网站中可能出现的损坏链接和服务器错误,或是识别网站中临时 ...

  5. 2018北京ICPC D. Frog and Portal(构造)

    D : Frog and Portal 时间限制:1000ms  单点时限:1000ms  内存限制:512MB 描述 A small frog wants to get to the other s ...

  6. [codeforces 1324C] Frog Jumps 一直向右+边界处理

    Codeforces Round #627 (Div. 3)   比赛人数6434 [codeforces 1324C]  Frog Jumps   一直向右+边界处理 总目录详见https://bl ...

  7. Frog青蛙的约会【浙江省选2002】(数论)

    题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝着对方那里跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既 ...

  8. B. Frog Traveler(cf)bfs

    原题链接:Problem - 1601B - Codeforces 题目大意:一个青蛙它从井底跳出去.从x点可以网上蹦[0, ax]的距离到y点,到了y点之后又会掉下来by步.问你它最少走多少步出去. ...

  9. 18.06.27 POJ1054 The Troublesome Frog

    描述 In Korea, the naughtiness of the cheonggaeguri, a small frog, is legendary. This is a well-deserv ...

最新文章

  1. 谈谈-this与super
  2. win10 mysql 远程连接_win10 docker部署mysql并启动远程连接
  3. js设置和清除cookie
  4. 前端学习(639):undefine和null
  5. tortoisesvn创建部署项目_FrameWork如何进行云托管部署
  6. Java throws和throw
  7. Linux下查看CPU个数
  8. 1486. 数组异或操作
  9. python怎么保存为py文件_将python保存到运行的py文件目录中创建的文件夹中
  10. IBatis的resultMap使用
  11. 【转载】视频网站六间房将从200人减至60人裁员三分之二
  12. 渴望成为架构师的你,或许需要与这些大咖来一场面基
  13. 几款免费且实用的项目管理工具
  14. STM32CUBEIDE 安装报错 error launching installer 解决办法
  15. 下拉列表组合折线图,这样的Excel动态图表,你会吗?
  16. stm32f407 hal uasrt 1 使用
  17. Jim Keller:在指令集上辩论是一件悲哀的事情
  18. IDEA :插入代码模板(Ctrl+J )
  19. 你一定不全知道的SAP凭证类型,我肯定!
  20. IDE的下载和安装(试用 无注册码)

热门文章

  1. 通过GitHub网站发布网页
  2. vscode之神级插件整理(持续更新)
  3. python的format函数的用法及实例
  4. c语言 编写一个求圆面积的函数area,该函数有一个形式参数r,c语言编写一个求圆面积的函数area,有形参,类型为float...
  5. The import javax.servlet.FilterChain cannot be resolved
  6. 软工网络15团队作业4——Alpha阶段敏捷冲刺(一)
  7. Qt5操作Office及Word读写实例
  8. linux 巡检使用命令大全
  9. 开放腾讯会议云录制视频观看权限
  10. 【Kevin聊敏捷】02 项目管理的四种生命周期