HDU 4107(线段树 特殊懒惰标记)g++ TLE,c++才过(呜呜呜呜)

#include<cstring>
#include<cstdio>
#include<algorithm>
#define tree int o,int l,int r
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define lo o<<1
#define ro o<<1|1
#define inf 2e9
#define eps 1e-7
#define N 200009
using namespace std;
int m,n,T,t,q,p;
int ql,qr,c;
int minx[N<<2],lazy[N<<2],val[N<<2];
void build(tree)
{
    minx[o]=p;
    lazy[o]=0;
    if(l<r)
    {
        int mid=(l+r)>>1;
        build(lson);
        build(rson);
    }
}
void init()
{
    memset(val,0,sizeof(val[0])*(n+1));
    memset(lazy,0,sizeof(lazy));
    build(1,1,n);
    return ;
}
void pushup(int o)
{
    minx[o]=min(minx[lo],minx[ro]);
}
void pushdown(int o)
{
    if(lazy[o])
    {
        lazy[lo]+=lazy[o];
        lazy[ro]+=lazy[o];
        minx[lo]-=lazy[o];//修改子节点的所有信息,WA
        minx[ro]-=lazy[o];

        lazy[o]=0;
    }
}
void update(tree)
{
    if(l==r)
    {
        if(val[l]>=p)
            val[l]+=(c+lazy[o])*2;
        else
            val[l]+=c+lazy[o];

        lazy[o]=0;
        minx[o]=p-val[l];//WA
        if(minx[o]<=0)
            minx[o]=inf;
    }
    else
    {
        int mid=(l+r)>>1;
        if(ql<=l&&qr>=r)
        {
            if(minx[o]<=c)
            {
                pushdown(o);
                if(ql<=mid)update(lson);
                if(qr>mid)update(rson);
                pushup(o);
            }
            else
            {
                minx[o]-=c;
                lazy[o]+=c;
            }
        }
        else
        {
            pushdown(o);
            if(ql<=mid)update(lson);
            if(qr>mid)update(rson);
            pushup(o);
        }
    }
}
void query(tree)
{
    if(l==r)
    {
        if(val[l]>=p)
            val[l]+=(lazy[o])*2;
        else
            val[l]+=lazy[o];
        printf("%d%c",val[l],l==n?'\n':' ');
    }
    else
    {
        pushdown(o);
        int mid=(l+r)>>1;
        query(lson);
        query(rson);
//        pushup(o);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("ex.in","r",stdin);
#endif
    while(scanf("%d%d%d",&n,&q,&p)==3)
    {
        init();
        while(q--)
        {
            scanf("%d%d%d",&ql,&qr,&c);
            update(1,1,n);
        }
        query(1,1,n);
    }
    return 0;
}
View Code

 

posted @ 2013-10-15 09:49  baoff  阅读(292)  评论(0编辑  收藏  举报