标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6581 Accepted Submission(s):
2625
#include<stdio.h> #include<string.h> #include<algorithm> #define MAX 32010 using namespace std; int sum[MAX<<2]; int pos[MAX];//记录各等级星星的个数 void pushup(int o) { sum[o]=sum[o<<1]+sum[o<<1|1]; } void gettree(int o,int l,int r) { sum[o]=0; if(l==r) return ; int mid=(l+r)>>1; gettree(o<<1,l,mid); gettree(o<<1|1,mid+1,r); pushup(o); } void update(int o,int l,int r,int L) { if(l==r) { sum[o]+=1; return ; } int mid=(l+r)>>1; if(L<=mid)//因为建树的过程是按照星星的纵坐标从小到大建立的所以此处 //只需要考虑横坐标的情况,当横坐标小于mid对左子树进行操作 //否则对右子树进行操作。 update(o<<1,l,mid,L); else update(o<<1|1,mid+1,r,L); pushup(o); } int find(int o,int l,int r,int L,int R) { if(L<=l&&R>=r) return sum[o]; int ans=0; int mid=(l+r)>>1; if(L<=mid) ans+=find(o<<1,l,mid,L,R); if(R>mid) ans+=find(o<<1|1,mid+1,r,L,R); return ans; } int main() { int n,m,j,i; int x,y; int level; while(scanf("%d",&n)!=EOF) { memset(pos,0,sizeof(pos)); gettree(1,1,MAX); for(i=0;i<n;i++) { scanf("%d%d",&x,&y); level=find(1,1,MAX,1,x+1); pos[level]++; update(1,1,MAX,x+1); } for(i=0;i<n;i++) printf("%d\n",pos[i]); } return 0; }
hdoj 1541 Stars【线段树单点更新+最大值维护】
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4800983.html