poj 2352
线段树题
注意思想。
代码:
#include<iostream> #include<fstream> using namespace std; struct e{ int l,r; int cn; }tree[70000]; int level[15001]; int n; int x[15001],y[15001]; int maxx; void build(int l,int r,int p){ tree[p].l=l; tree[p].r=r; tree[p].cn=0; if(l<r) { int mid=(l+r)>>1; build(l,mid,p*2); build(mid+1,r,p*2+1); } } void insert(int l,int p){ if(l==tree[p].l&&l==tree[p].r) { tree[p].cn++; return; } int mid=(tree[p].l+tree[p].r)>>1; if(l<=mid) insert(l,p*2); else insert(l,p*2+1); tree[p].cn++; } int find(int l,int r,int p){ if(l==tree[p].l&&r==tree[p].r) { return tree[p].cn; } int mid=(tree[p].l+tree[p].r)>>1; if(r<=mid) return find(l,r,2*p); if(l>mid) return find(l,r,2*p+1); else return find(l,mid,2*p)+find(mid+1,r,2*p+1); } void read(){ // ifstream cin("in.txt"); int i,j,k; cin>>n; for(i=1;i<=n;i++) { cin>>x[i]>>y[i]; maxx=max(maxx,x[i]); } build(0,maxx,1); for(i=1;i<=n;i++) { level[find(0,x[i],1)]++; insert(x[i],1); } for(i=0;i<n;i++) cout<<level[i]<<endl; } int main(){ read(); return 0; }