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 }

 

posted @ 2015-04-20 17:04  miao_a_miao  阅读(121)  评论(0编辑  收藏  举报