HDU 4107(线段树 特殊懒惰标记)g++ TLE,c++才过(呜呜呜呜)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }