Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:树状数组(先排序,按第一个元素升序,当第一个元素相同时,按第二个元素升序排序,在往上统计,往下维护),注意结果要用long long存In Reply To:树状数组(先排序,按第一个元素升序,当第一个元素相同时,按第二个元素升序排序,在往上统计,往下维护),注意结构要用long long存 Posted by:0700302510 at 2017-08-06 16:36:11 > #include<stdio.h> > #include<string.h> > #include<iostream> > #include<algorithm> > using namespace std; > const int inf=1000100; > struct node{ > int st,ed; > }th[inf]; > long long shu[inf]; > int n,m,k; > int same[inf]; > bool tmp(node a,node b) > { > if(a.st==b.st) > return a.ed<b.ed; > return a.st<b.st; > } > int lowbit(int i) > { > return i&(-1*i); > } > int sum(int i) > { > long long ans; > ans=0; > while(i<=inf){ > ans+=shu[i]; > i+=lowbit(i); > } > return ans; > } > void reset(int i) > { > while(i>0){ > shu[i]+=1; > i-=lowbit(i); > } > } > int main() > { > int num; > int i,j; > scanf("%d",&num); > int N=0; > while(num--){ > memset(same,0,sizeof(same)); > memset(shu,0,sizeof(shu)); > scanf("%d %d %d",&n,&m,&k); > for(i=0;i<k;i++){ > scanf("%d %d",&th[i].st,&th[i].ed); > } > sort(th,th+k,tmp); > /* for(i=0;i<k;i++){ > printf("%d %d\n",th[i].st,th[i].ed); > }*/ > long long ans=0; > for(i=0;i<k;i++){ > ans+=sum(th[i].ed+1); > same[th[i].ed]++; > reset(th[i].ed); > } > printf("Test case %d: %lld\n",++N,ans); > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator