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

转载 2016年08月29日 16:52:23

题意

有n只青蛙,站在m大的一个环形上面

青蛙的位置是pi,每次移动ai

每只青蛙按照编号顺序移动,会撞掉他所经过的青蛙,每撞掉一只,会使得这只青蛙移动的距离减小1

然后问你一直循环下去,还剩下哪些青蛙

题解:

模拟

但是别按照编号的顺序去模拟,我们按照相撞的时间先后顺序去模拟就好了

首先我们可以得到一个信息,这只青蛙如果会和别的青蛙相撞,那么最先相撞的,肯定是他的下一只青蛙。

然后我们把相撞的时间记录下来(究竟是第几个回合,才会撞到那只青蛙

然后我们用一个Set或者优先队列,不断模拟这个过程就好了

每次抽出相撞时间最短的青蛙来,然后撞掉。

最后剩下的青蛙都不相撞为止。

因为每次更新的复杂度是logn,每次更新必定会减小一只青蛙,所以复杂度是nlogn的

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF  0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 1000100
#define MOD 1000000007
#include<bits/stdc++.h>
int n,m;
int p[maxn],a[maxn];
int nxt[maxn],pre[maxn];
set<pair<int,int> > S;
pair<int,int> c[maxn];

int time(int x,int y)
{
    if(x == y)
        return INF;
    long long p1 = p[x],p2 = p[y];
    if(x > y)
        p2 = (p2 + a[y]) % m;
    if(p2 < p1)
        p2 += m;
    if(p2 - p1 <= a[x])
        return 1;
    if(a[y] >= a[x])
        return INF;
    int l = 1,r = INF,ans = INF;
    while(l <= r)
    {
        int mid = (l + r) >> 1;
        if(p1 + 1ll*a[x]*mid >= p2 + 1ll*a[y]*(mid-1))
            ans = mid,r = mid - 1;
        else
            l = mid + 1;
    }
    return ans;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int t,C = 1;
    //scanf("%d",&t);
    while(scanf("%d%d",&n,&m) != EOF)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d",&p[i],&a[i]);
            p[i]--;
            c[i].first = p[i];
            c[i].second = i;
        }
        sort(c,c+n);
        for(int i = 0; i < n; i++)
        {
            nxt[c[i].second] = c[(i+1)%n].second;
            pre[c[i].second] = c[(i-1+n)%n].second;
        }
        for(int i = 0; i < n; i++)
            S.insert(make_pair(time(i,nxt[i]),i));
        while(!S.empty())
        {
            pair<int,int> now = *S.begin();
            if(now.first == INF)
                break;
            S.erase(now);
            int x = now.second;
            S.erase(make_pair(time(nxt[x],nxt[nxt[x]]),nxt[x]));
            S.erase(make_pair(time(pre[x],x),pre[x]));
            p[x] += now.first,a[x]--;
            nxt[x] = nxt[nxt[x]];
            pre[nxt[x]] = x;
            S.insert(make_pair(time(pre[x],x),pre[x]));
            S.insert(make_pair(time(x,nxt[x]),x));
        }
        printf("%d\n",S.size());
        for(set<pair<int,int> >::iterator it = S.begin(); it != S.end(); it++)
            printf("%d ",(*it).second+1);
        printf("\n");
    }
    return 0;
}


【Codeforces Round 375 (Div 2) E】【欧拉回路Fleury算法 或网络流】One-Way Reform 每条边定向使得最多的点满足入度=出度

E. One-Way Reform time limit per test 2 seconds memory limit per test 256 megabytes ...
  • snowy_smile
  • snowy_smile
  • 2016年10月04日 10:20
  • 737

Codeforces Round #406 (Div. 2):C. Berzerk(记忆化搜索解决博弈问题)

C. Berzerk time limit per test 4 seconds memory limit per test 256 megabytes input standard in...
  • Jaihk662
  • Jaihk662
  • 2017年03月24日 15:23
  • 800

【专题】线段树

单点更新 最最基础的线段树,只更新叶子节点,然后把信息用PushUP(int r)这个函数更新上来。 hdu1166 敌兵布阵 线段树 hdu 1166 敌兵布阵 单点更新区间求和 hdu1754 ...
  • cyendra
  • cyendra
  • 2013年05月12日 17:33
  • 738

【CF 140E】New Year Garland(第二类斯特林(Stirling)数+DP+容斥)

【CF 140E】New Year Garland(第二类斯特林(Stirling)数+DP+容斥) E. New Year Garlandtime limit per test5 secondsme...
  • ChallengerRumble
  • ChallengerRumble
  • 2016年08月08日 14:45
  • 688

LibreOJ β Round #2 A. 模拟只会猜题意【前缀和】

A. 模拟只会猜题意 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 转到题库提交记录返回比赛 ...
  • mengxiang000000
  • mengxiang000000
  • 2017年07月03日 17:56
  • 454

数学推公式——较难——Codeforces Round #187 (Div. 2)

题目链接: http://codeforces.com/contest/315/problem/C C. Sereja and Contest time limi...
  • CS_liuqing
  • CS_liuqing
  • 2013年06月16日 15:34
  • 1998

Codeforces Round #244 (Div. 2)(强连通分量,后缀数组)

A. Police Recruits #include #include #include #include using namespace std; int n; int main() { ...
  • u010660276
  • u010660276
  • 2014年05月23日 20:08
  • 421

Codeforces Round #248 (Div. 2) B题 【数据结构:树状数组】

题目链接:http://codeforces.com/contest/433/problem/B 题目大意:给n(1 ≤ n ≤ 105)个数据(1 ≤ vi ≤ 109),其中有m(1 ≤ m ≤...
  • u013912596
  • u013912596
  • 2014年05月24日 18:18
  • 708

Codeforces Round #312 (Div. 2) (第三题是位运算,好题)

比赛:点击打开链接 558A - Lala Land and Apple Trees 分析:从0坐标分开,负半轴一个数组,正半轴一个数组,来记录果树的左边和数量,可以用结构体数组来存储数据,其...
  • loveyou11111111
  • loveyou11111111
  • 2015年08月31日 16:30
  • 156

【打CF,学算法——三星级】CodeForces 689C Mike and Chocolate Thieves (二分)

题目链接:CF 689C 题面: C. Mike and Chocolate Thieves time limit per test 2 seconds memory limit ...
  • David_Jett
  • David_Jett
  • 2016年07月08日 10:55
  • 793
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #342 (Div. 2) E. Frog Fights set 模拟★ ★
举报原因:
原因补充:

(最多只允许输入30个字)