Problem G Galactic Collegiate Programming Contest

Codeforces Gym101572 G.Galactic Collegiate Programming Contest (2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017))_算法

 

 Codeforces Gym101572 G.Galactic Collegiate Programming Contest (2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017))_算法_02

这个题题意读了一会,就是几个队参加比赛,根据实时的信息,问你1号队的实时排名(题数和罚时相同的时候并列)。

暴力模拟,简直要模拟死了。。。有个地方感觉很有意思,就是如果某个队还一道题都没写出来的话根本就不用和1队比较,这里用一个数组存一下出题数大于等于1的队伍,直接比较这些队伍就可以,如果全都比较一遍就会超时,真的,相信我。

 

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<string.h>
 7 #include<set>
 8 #include<vector>
 9 #include<queue>
10 #include<stack>
11 #include<map>
12 #include<cmath>
13 using namespace std;
14 typedef long long ll;
15 const int INF=0x3f3f3f3f;
16 double PI=acos(-1.0);
17 const int maxn=1e5+100;
18 int s[maxn],t[maxn],num[maxn],flag[maxn];
19 int main(){
20     int m,n,a,b,h,ans;
21     while(~scanf("%d%d",&m,&n)){
22         memset(flag,0,sizeof(flag));
23         memset(s,0,sizeof(s));
24         memset(t,0,sizeof(t));
25         memset(num,0,sizeof(num));
26         h=0,ans=0;
27         for(int i=0;i<n;i++){
28             scanf("%d%d",&a,&b);
29                 num[a]++;
30                 t[a]+=b;
31                 if(num[a]==1)s[h++]=a;
32                 if(a==1){
33                     for(int j=0;j<h;j++){
34                         int cnt=s[j];
35                         if(cnt==1)continue;
36                         if(num[cnt]+1==num[1]&&(t[cnt]<(t[1]-b))){
37                             ans--;
38                             flag[cnt]=0;
39                         }
40                         else if(num[cnt]==num[1]&&t[cnt]>=t[1]){
41                             ans--;
42                             flag[cnt]=0;
43                         }
44                     }
45                 }
46                 else{
47                     if(num[a]==num[1]+1&&!flag[a]){
48                         ans++;flag[a]=1;
49                     }
50                     if(num[a]==num[1]&&t[a]<t[1]&&!flag[a]){
51                         ans++;flag[a]=1;
52                     }
53                 }
54             printf("%d\n",ans+1);
55         }
56     }
57     return 0;
58 }