Vases and Flowers HDU

来源:互联网 发布:泽宇网络传媒有限公司 编辑:程序博客网 时间:2024/05/20 08:21
点击打开链接
这道题其实就是区间覆盖问题 不过现在有两种区间覆盖操作 区别一下即可
还有一问是要求插花时的第一个和最后一个花瓶是谁 网上都说要二分 不过我感觉下面代码中的方法比较好 是一个同学搞出来的 很好使
这道题静下心写写 调调bug也就过了
#include <stdio.h>#define N 99999999struct node{    int l;    int r;    int num;    int laz;};struct node sum[200001];int n,val,s,e,ans;int judge(int u,int v){    if(u>v) return u;    else return v;}void pushup(int cur);void pushdown(int cur);void build(int l,int r,int cur);void update1(int ll,int cur);void update2(int ll,int rr,int cur);int main(){    int t,q,op,a,b;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&q);        build(0,n-1,1);        while(q--)        {            scanf("%d%d%d",&op,&a,&b);            if(op==1)            {                val=b,s=N,e=-1;                update1(a,1);                if(s==N&&e==-1)                {                    printf("Can not put any one.\n");                }                else                {                    printf("%d %d\n",s,e);                }            }            else            {                ans=0;                update2(a,b,1);                printf("%d\n",ans);            }        }        printf("\n");    }    return 0;}void pushup(int cur){    sum[cur].num=sum[cur*2].num+sum[cur*2+1].num;    return;}void pushdown(int cur){    if(sum[cur].laz==1)    {        sum[cur*2].num=sum[cur*2].r-sum[cur*2].l+1;        sum[cur*2].laz=1;        sum[cur*2+1].num=sum[cur*2+1].r-sum[cur*2+1].l+1;        sum[cur*2+1].laz=1;        sum[cur].laz=0;    }    if(sum[cur].laz==2)    {        sum[cur*2].num=0;        sum[cur*2].laz=2;        sum[cur*2+1].num=0;        sum[cur*2+1].laz=2;        sum[cur].laz=0;    }    return;}void build(int l,int r,int cur){    int m;    sum[cur].l=l;    sum[cur].r=r;    sum[cur].num=0;    sum[cur].laz=0;    if(l==r) return;    m=(l+r)/2;    build(l,m,cur*2);    build(m+1,r,cur*2+1);    return;}void update1(int ll,int cur){    if(sum[cur].r-sum[cur].l+1==sum[cur].num||val<=0) return;    if(sum[cur].r<ll) return;    if(sum[cur].num==0&&sum[cur].r-judge(sum[cur].l,ll)+1<=val)    {        if(ll<=sum[cur].l)        {            if(sum[cur].l<s) s=sum[cur].l;            if(sum[cur].r>e) e=sum[cur].r;            sum[cur].num=sum[cur].r-sum[cur].l+1;            sum[cur].laz=1;            val-=sum[cur].r-sum[cur].l+1;            return;        }    }    if(sum[cur].l==sum[cur].r) return;    pushdown(cur);    update1(ll,cur*2);    update1(ll,cur*2+1);    pushup(cur);    return;}void update2(int ll,int rr,int cur){    if(sum[cur].l==ll&&sum[cur].r==rr)    {        ans+=sum[cur].num;        sum[cur].num=0;        sum[cur].laz=2;        return;    }    if(sum[cur].l==sum[cur].r) return;    pushdown(cur);    if(rr<=sum[cur*2].r)    {        update2(ll,rr,cur*2);    }    else if(ll>=sum[cur*2+1].l)    {        update2(ll,rr,cur*2+1);    }    else    {        update2(ll,sum[cur*2].r,cur*2);        update2(sum[cur*2+1].l,rr,cur*2+1);    }    pushup(cur);    return;}

原创粉丝点击