您的位置:首页 > 其它

51nod 1287 线段树

2017-08-21 19:21 381 查看

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287

简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
const int MAX=50005;
int A[MAX];
struct SegTree
{
#define M ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
int maxv[MAX<<2],tot;
void init(){memset(maxv,0,sizeof(maxv));tot=0;}
void push_up(int id)
{
maxv[id]=max(maxv[lc],maxv[rc]);
}
void build(int L,int R,int id)
{
if(L==R) {
maxv[id]=A[++tot];
return; }
build(L,M,lc);
build(M+1,R,rc);
push_up(id);
}
int Find(int L,int R,int id,int v)
{
//cout<<L<<' '<<R<<' '<<id<<endl;
if(L==R) {return L;}
if(maxv[lc]>=v){
return Find(L,M,lc,v);
}
else{
return Find(M+1,R,rc,v);
}
}
void change(int L,int R,int id,int x)
{
if(L==R){maxv[id]++;return;}
if(x<=M) change(L,M,lc,x);
else change(M+1,R,rc,x);
push_up(id);
}
}seg;
int main()
{
int n,m,i,j,k,b;
cin>>m>>n;
seg.init();
for(i=1;i<=m;++i)
scanf("%d",&A[i]); A[m+1]=inf;
seg.build(1,m+1,1);
for(i=1;i<=n;++i)
{
scanf("%d",&b);
k=seg.Find(1,m+1,1,b);
if(k==1||k==m+1) continue;
A[k-1]++;
seg.change(1,m+1,1,k-1);
}
for(i=1;i<=m;++i) printf("%d\n",A[i]);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: