Description
Input
Output
Sample Input
1 3 4 4 1 4 2 3 3 2 3 1
Sample Output
Test case 1: 5
思路:
按第一维升序,第二维升序排列之后,用第二维进行树状数组就可以了
当前为 x,y ,要有交点的话,要找出在这个点之前有多少个点的y值大于y,也就是这条边与之前的那些边的交点个数,树状数组向下更新,向上求和
1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 #include<vector> 5 #include<queue> 6 #include<stack> 7 #include<algorithm> 8 #include<cstring> 9 #include<stdlib.h> 10 #include<string> 11 #include<cmath> 12 using namespace std; 13 #define pb push_back 14 int n,m,k; 15 __int64 p[1100]; 16 struct node{ 17 int x,y; 18 }num[1001000]; 19 int cmp(node a,node b){ 20 if(a.x==b.x) return a.y<b.y; 21 return a.x<b.x; 22 } 23 void update(int pos){ 24 while(pos>=1){ 25 p[pos]+=1; 26 pos-=pos&(-pos); 27 } 28 } 29 __int64 getnum(int pos){ 30 __int64 sum=0; 31 while(pos<=m){ 32 sum+=p[pos]; 33 pos+=pos&(-pos); 34 } 35 return sum; 36 } 37 int main(){ 38 int t,cas=0;cin>>t; 39 while(t--){ 40 cin>>n>>m>>k; 41 memset(p,0,sizeof(p)); 42 for(int i=1;i<=k;i++) 43 scanf("%d%d",&num[i].x,&num[i].y); 44 sort(num+1,num+1+k,cmp); 45 __int64 ans=0; 46 for(int i=1;i<=k;i++){ 47 ans+=getnum(num[i].y+1); 48 update(num[i].y); 49 } 50 printf("Test case %d: %I64d\n",++cas,ans); 51 } 52 }
原文:http://www.cnblogs.com/ainixu1314/p/3888693.html