hdu2795线段树

来源:互联网 发布:算法与数据结构kmpnext 编辑:程序博客网 时间:2024/05/22 11:03
//===========================================//segment tree//final version//by kevin_samuel(fenice)//以h离散化构建线段树#include <iostream>#include <cstdio>#include <cmath>using namespace std;#define MAXN 201050#define INF 0x3fffffffint h,w,n;int A[MAXN];//int max;//int min;struct node{    int left;    int right;    int max;}Tree[MAXN<<2];void maintain(int root){    int LC = root<<1;    int RC = (root<<1)+1;    Tree[root].max = max(Tree[LC].max,Tree[RC].max);}void Build(int root,int start,int end){    Tree[root].left = start;    Tree[root].right = end;    if(start == end)    {        Tree[root].max = w;        return;    }    int mid = (start + end)>>1;    Build(root<<1,start,mid);    Build((root<<1)+1,mid+1,end);    maintain(root);}void update(int root,int pos,int value){    if(Tree[root].left == Tree[root].right)    {        Tree[root].max -= value;        return;    }    int mid = (Tree[root].left + Tree[root].right)>>1;    if(pos <= mid)        update(root<<1,pos,value);    else        update((root<<1)+1,pos,value);    maintain(root);}int Query(int root,int start,int end,int value){    if(Tree[root].max < value)        return -1;    if(start == end)        return start;    int mid = (start + end)>>1;    if(Tree[root<<1].max >= value)        return Query(root<<1,start,mid,value);    else        return Query(root<<1|1,mid+1,end,value);    }int main(){    while(scanf("%d%d%d",&h,&w,&n)!=EOF)    {        int hh = min(h,n);        Build(1,1,hh);        for(int i = 1; i <= n; i++)        {            scanf("%d",&A[i]);            int ans = Query(1,1,hh,A[i]);            cout<<ans<<endl;            if(ans != -1)                 update(1,ans,A[i]);        }    }    return 0;}

原创粉丝点击