hdu1541树状数组(降维打击)
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1541/
题意是:在二维图上有一系列坐标,其中坐标给出的顺序是:按照y升序排序,如果y值相同则按照x升序排序。这个信息十分关键,所以借此我们可以知道最新给出点A(x,y)之后,y大于等于任何之前点的y值,所以只要知道之前点的x值有多少个是小于等于x就能得知新给出的点的等级,所以不必用二维的树状数组来实现,而且二维树状数组的空间不够。我们只要将其降维即可。
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef unsigned int ui; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define pf printf 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 #define prime1 1e9+7 9 #define prime2 1e9+9 10 #define pi 3.14159265 11 #define scand(x) scanf("%llf",&x) 12 #define f(i,a,b) for(int i=a;i<=b;i++) 13 #define scan(a) scanf("%d",&a) 14 #define dbg(args) cout<<#args<<":"<<args<<endl; 15 #define pb(i) push_back(i) 16 #define ppb(x) pop_back(x) 17 #define inf 0x3f3f3f3f 18 #define maxn 35005 19 int n,m,t,x,y; 20 int c[maxn],level[maxn]; 21 int lowbit(int x) 22 { 23 return x&(-x); 24 } 25 int query(int x) 26 { 27 int ans=0; 28 for(int i=x;i>0;i-=lowbit(i)) 29 { 30 ans+=c[i]; 31 } 32 return ans; 33 } 34 void update(int x,int C) 35 { 36 for(int i=x;i<=maxn;i+=lowbit(i)) 37 { 38 c[i]+=C; 39 } 40 } 41 int main() 42 { 43 //freopen("input.txt","r",stdin); 44 //freopen("output.txt","w",stdout); 45 std::ios::sync_with_stdio(false); 46 while(scan(n)!=EOF) 47 { 48 mem(level,0); 49 mem(c,0); 50 f(kk,1,n) 51 { 52 scan(x); 53 scan(y); 54 int tmp=query(++x); 55 // dbg(tmp); 56 level[tmp]++; 57 update(x,1); 58 } 59 f(i,0,n-1) 60 { 61 pf("%d\n",level[i]); 62 } 63 } 64 }
每一个不曾起舞的日子,都是对生命的辜负。