poj 2481 树状数组
题目大意:给你很多线段的头S和尾E,问每一条线段中包含了多少个线段,(S和E相同不计在内)
变成坐标系上的点后求每个点左上角的点的个数
按y从大到小插入结点
3
1 2
0 3
3 4
0
1 0 0
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 int n,m,tt; 15 const int MAXN=100005; 16 int c[MAXN],val[MAXN]; 17 int lowbit(int x) 18 { 19 return x&(-x); 20 } 21 void add(int i,int val) 22 { 23 while(i<=n) 24 { 25 c[i]+=val; 26 i+=lowbit(i); 27 } 28 } 29 int sum(int i) 30 { 31 int s=0; 32 while(i>0) 33 { 34 s+=c[i]; 35 i-=lowbit(i); 36 } 37 return s; 38 } 39 struct node 40 { 41 int x,y,id; 42 void in(int i) 43 { 44 scanf("%d%d",&x,&y); 45 x++,y++; 46 id=i; 47 } 48 }a[MAXN]; 49 bool cmp(node a,node b) 50 { 51 if(a.y==b.y) return a.x<b.x; 52 return a.y>b.y; 53 } 54 int main() 55 { 56 int i,j; 57 #ifndef ONLINE_JUDGE 58 freopen("1.in","r",stdin); 59 #endif 60 while(scanf("%d",&n)!=EOF&&n!=0) 61 { 62 cl(val); 63 cl(c); 64 cl(a); 65 for(i=0;i<n;i++) 66 { 67 a[i].in(i); 68 } 69 sort(a,a+n,cmp); 70 val[a[0].id]=0; 71 add(a[0].x,1); 72 for(i=1;i<n;i++) 73 { 74 if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y) val[a[i].id]=val[a[i-1].id]; //区间完全重合 75 else 76 { 77 val[a[i].id]=sum(a[i].x); 78 } 79 add(a[i].x,1); 80 } 81 int k=0; 82 for(i=0;i<n;i++) 83 { 84 if(k++) printf(" "); 85 printf("%d",val[i]); 86 } 87 printf("\n"); 88 } 89 return 0; 90 }