poj2352Stars

http://poj.org/problem?id=2352

二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define N 32010

 8 struct node

 9 {

10     int x, y;

11 }st[N];

12 int s[N<<2],f[N];

13 bool cmp(node a,node b)

14 {

15     if(a.y==b.y)

16     return a.x<b.x;

17     return a.y<b.y;

18 }

19 void build(int l,int r,int w)

20 {

21     s[w] = 0;

22     if(l==r)

23     {

24         return ;

25     }

26     int m = (l+r)>>1;

27     build(l,m,w<<1);

28     build(m+1,r,w<<1|1);

29 }

30 void pushup(int w)

31 {

32     s[w] = s[w<<1]+s[w<<1|1];

33 }

34 void update(int p,int l,int r,int w)

35 {

36     if(l==r)

37     {

38         s[w] += 1;

39         return ;

40     }

41     int m = (l+r)>>1;

42     if(p<=m)

43     update(p,l,m,w<<1);

44     else

45     update(p,m+1,r,w<<1|1);

46     pushup(w);

47 }

48 int getsum(int a,int b,int l,int r,int w)

49 {

50     if(a<=l&&b>=r)

51     {

52         return s[w];

53     }

54     int m = (l+r)>>1,res=0;

55     if(a<=m)

56     res+=getsum(a,b,l,m,w<<1);

57     if(b>m)

58     res+=getsum(a,b,m+1,r,w<<1|1);

59     return res;

60 }

61 int main()

62 {

63     int i,n;

64     while(cin>>n)

65     {

66         memset(f,0,sizeof(f));

67         build(1,n,1);

68         for(i = 1; i <= n ; i++)

69         scanf("%d%d",&st[i].x,&st[i].y);

70         sort(st+1,st+n+1,cmp);

71         for(i = 1; i <= n ; i++)

72         {

73             int s = getsum(1,st[i].x+1,1,N,1);

74             update(st[i].x+1,1,N,1);

75             f[s]++;

76         }

77         for(i = 0 ; i < n ; i++)

78         cout<<f[i]<<endl;

79     }

80     return 0;

81 }
View Code

 

你可能感兴趣的:(tar)