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;
}
浙公网安备 33010602011771号