标签:show code include poj play sed cli str can
题目链接:POJ - 2481
题目大意:
给出区间A[s1,s2],区间B[s3,s4].
如果区间A包涵区间B且不是完全重合,则区间A的强壮度+1。
问对于每个区间,他们被多少个区间包含。
题目分析:
其实可以把区间的起始点和结束点 i 和 j 转换成坐标X,Y。
然后这个题就可以转换成类似于POJ - 2352 的题目了。
套用树状数组即可。
给出代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<vector> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 const int inf=1e5; 9 int vis[inf+10]; 10 int num[inf+10]; 11 int bit(int x) 12 { 13 return (x&(-x)); 14 } 15 struct node 16 { 17 int x; 18 int y; 19 int id; 20 }nodes[inf+10]; 21 bool cmp(const node& a,const node& b) 22 { 23 if(a.y!=b.y) 24 return a.y>b.y; 25 else 26 return a.x<b.x; 27 } 28 int sum(int pos) 29 { 30 int s=0; 31 while(pos>0) 32 { 33 s+=vis[pos]; 34 pos-=bit(pos); 35 } 36 return s; 37 } 38 void add(int x,int pos) 39 { 40 while(pos<=inf) 41 { 42 vis[pos]+=x; 43 pos+=bit(pos); 44 } 45 return; 46 } 47 int n; 48 int main() 49 { 50 while(cin>>n&&n) 51 { 52 memset(vis,0,sizeof(vis)); 53 for(int i=0;i<n;i++) 54 { 55 scanf("%d%d",&nodes[i].x,&nodes[i].y); 56 nodes[i].x++; 57 nodes[i].id=i; 58 } 59 sort(nodes,nodes+n,cmp); 60 for(int i=0;i<n;) 61 { 62 int s=sum(nodes[i].x); 63 num[nodes[i].id]=s; 64 int j; 65 for(j=i;j<n&&(j==i||(nodes[j].x==nodes[j-1].x&&nodes[j].y==nodes[j-1].y));j++) 66 { 67 add(1,nodes[j].x); 68 num[nodes[j].id]=s; 69 } 70 i=j; 71 } 72 for(int i=0;i<n;i++) 73 { 74 if(i!=0) 75 printf(" "); 76 printf("%d",num[i]); 77 } 78 printf("\n"); 79 } 80 return 0; 81 }
标签:show code include poj play sed cli str can
原文地址:http://www.cnblogs.com/DLKKILL/p/7398423.html