Nordic Collegiate Programming Contest NCPC 2017-Problem G Galactic Collegiate Programming Contest

题目大意:有n( n<1e5 )只队伍参加程序竞赛,然后给m个信息,每个信息告诉你第p

个队伍过了一题,并且告诉你罚时是多少,让你输入每个信息之后,第一个队伍的

排名。

 

思路:一眼看过去就像数据结构题,我们可以用足够大的数表示过了一题然后减去罚时,

这样就可以用一个数值来确定排名,然后我们用将所有出现过的分数抽离出来,排序去重

用这些数离散化用树状数组维护各个分数队伍数的前缀和,这样就能快速计算排名。

 

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const double g=10.0,eps=1e-7;
 5 const int N=100000+10,maxn=400,inf=0x3f3f3f3f;
 6 int te[N],pe[N],cnt;
 7 ll pen[N],has[N];
 8 ll sum[N];
 9 void update(int i,ll v)
10 {
11     while(i<cnt)
12     {
13         printf("%d %d**\n",i,cnt);
14         sum[i]+=v;
15         i+=i&(-i);
16     }
17 }
18 ll query(int i)
19 {
20     ll ans=0;
21     while(i>0)
22     {
23         ans+=sum[i];
24         i-=i&(-i);
25     }
26     return ans;
27 }
28 int main()
29 {
30     int n,m;
31     scanf("%d%d",&n,&m);
32     cnt=1;
33     has[cnt++]=0;
34     for(int i=0;i<m;i++)
35     {
36         scanf("%d%d",&te[i],&pe[i]);
37         pen[te[i]]+=1e10-pe[i];
38         has[cnt++]=pen[te[i]];
39     }
40     sort(has+1,has+cnt);
41     cnt=unique(has+1,has+cnt)-has;
42     memset(pen,0,sizeof pen);
43     update(1,n);
44     for(int i=0;i<m;i++)
45     {
46         int p=lower_bound(has+1,has+cnt,pen[te[i]])-has;
47         update(p,-1);
48         pen[te[i]]+=1e10-pe[i];
49         p=lower_bound(has+1,has+cnt,pen[te[i]])-has;
50         update(p,1);
51         p=lower_bound(has+1,has+cnt,pen[1])-has;
52         int res=query(cnt-1)-query(p);
53         printf("%d\n",res+1);
54     }
55     return 0;
56 }
57 /********************
58 
59 ********************/
View Code

 

posted @ 2017-10-15 17:59  NotNight  阅读(336)  评论(0编辑  收藏  举报