zoukankan      html  css  js  c++  java
  • 【CF625E】Frog Fights(模拟)

    【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
    ",S.size());
    	for(set<pair<int,int> >::iterator it=S.begin();it!=S.end();++it)printf("%d ",it->second);
    	puts("");return 0;
    }
    
    
  • 相关阅读:
    dubbo No provider available for the service com.alibaba.dubbo.monitor.MonitorService from registry
    mvn install
    centos mysql 数据存储目录安装位置
    maven项目依赖被改为文件夹时如何改回lib
    Oracle 用户权限分配说明
    PowerDesigner中创建Oracle表全过程记录
    Oracle创建表时涉及的参数解析
    PowerDesigner使用技巧
    关于Web服务器域名设置相关知识积累
    【转载】错误:ORA-28002: the password will expire within 7 days 解决方法
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9254445.html
Copyright © 2011-2022 走看看