C++-POJ2352-Stars[数据结构][树状数组]

/*
虽然题目没说,但是读入有以下特点 
由于,输入是按照按照y递增,如果y相同则x递增的顺序给出的
所以,可以利用入读的时间进行降为处理
*/

于是我们就得到了一个一维的树状数组解法啦

值得一提:坐标从0~32000,而树状数组是从1开始的

于是,我们对所有下标+1,数组开到32002就可以啦!

 1 #include <set>
 2 #include <map>
 3 #include <cmath>
 4 #include <queue>
 5 #include <vector>
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <cstring>
 9 #include <iostream>
10 #include <algorithm>
11 using namespace std;
12 const int MAXN=15001,MAXX=32002;
13 int t[MAXX],n;
14 int lb(int i){return i&-i;}
15 void init(){memset(t,0,sizeof(t));}
16 void add(int x,int v){for(int i=x;i<MAXX;i+=lb(i))t[i]+=v;}
17 int sum(int x){int ans=0;for(int i=x;i;i-=lb(i))ans+=t[i];return ans;}
18 
19 int level[MAXN],x,y;
20 int main(){
21     scanf("%d",&n);
22     for(int i=1;i<=n;i++)scanf("%d%d",&x,&y),level[sum(x+1)]++,add(x+1,1);
23     for(int i=0;i<n;i++)printf("%d
",level[i]); 
24     return 0;
25 }
~~Jason_liu O(∩_∩)O
原文地址:https://www.cnblogs.com/JasonCow/p/12292308.html