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 ********************/