线段树卡常AC

P1083 [NOIP2012 提高组] 借教室

线段树标记永久化..简单易懂代码量少
by Mystery_Peacock @ 2018-11-02 23:04:42


@[buer](/space/show?uid=25204) %%%可是不会qwq
by qsmoonzh @ 2018-11-02 23:08:04


@[qsmoonzh](/space/show?uid=96546) 线段树log的加inline会快吧
by codesonic @ 2018-11-02 23:08:13


@[codesonic](/space/show?uid=45443) 快了一点点,顺便%思考熊qwq
by qsmoonzh @ 2018-11-02 23:18:41


@[qsmoonzh](/space/show?uid=96546) 噫 那就短小操作参数加入register
by codesonic @ 2018-11-02 23:21:02


可以做到无pushdown操作.. ```cpp #include<bits/stdc++.h> const int N=int(1e6)+10,INF=0x3f3f3f3f; int n,m,R[N]; inline void inIO(int &x){ char ch;x=0;while(!isdigit(ch=getchar())); do x=(x<<1)+(x<<3)+ch-'0';while(isdigit(ch=getchar())); } inline int min(int x,int y){ return x<y?x:y; } struct SegT{ struct Node{ int data,l,r,add; inline void init(int x,int y,int z){ data=x,l=y,r=z,add=0; } }T[N*4]; inline void update(int x){ T[x].data=min(T[x<<1].data+T[x<<1].add,T[x<<1|1].data+T[x<<1|1].add); } void build(int x,int l,int r){ T[x].init(r-l?INF:R[l],l,r); if(l-r){ int mid=l+r>>1; build(x<<1,l,mid),build(x<<1|1,mid+1,r); update(x); } } void modify(int x,int l,int r,int d){ if(T[x].l>r||T[x].r<l)return; if(T[x].l>=l&&T[x].r<=r){ T[x].add+=d;return; } modify(x<<1,l,r,d),modify(x<<1|1,l,r,d); update(x); } }_tree; int main(){ inIO(n),inIO(m); for(register int i=1;i<=n;++i) inIO(R[i]); _tree.build(1,1,n); for(register int i=1;i<=m;++i){ int d,s,t; inIO(d),inIO(s),inIO(t); _tree.modify(1,s,t,-d); if(_tree.T[1].data+_tree.T[1].add<0)return printf("-1\n%d\n",i),0; } return puts("0"),0; } ```
by Mystery_Peacock @ 2018-11-02 23:42:04


@[buer](/space/show?uid=25204) %%%不过好像快不了多少qwq
by qsmoonzh @ 2018-11-03 11:53:04


表示线段树最慢的300$ms$
by SpXace @ 2018-11-05 07:41:43


上一页 |