UOJ #164. 【清华集训2015】V 线段树
2017-10-08 00:22
441 查看
线段树维护分段函数。
写完交上去排rank3,然后喜闻乐见用fread卡到rank1 /捂脸熊
#include<cmath> #include<ctime> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<iomanip> #include<vector> #include<string> #include<bitset> #include<queue> #include<set> #include<map> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f; } void print(ll x) {if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');} const int N=500100; const ll inf=0X3f3f3f3f3f3f3f3fll; int n; struct seg_tree{ll a,b,c,d;}tr[N<<2]; inline void pushdown(int k) {//cout<<k<<endl; tr[k<<1].c=max(tr[k<<1].c,tr[k].c+tr[k<<1].a); tr[k<<1].d=max(tr[k].d,max(tr[k<<1].d,tr[k<<1].b+tr[k].c)); tr[k<<1].a=max(-inf,tr[k].a+tr[k<<1].a); tr[k<<1].b=max(tr[k<<1].b+tr[k].a,tr[k].b); tr[k<<1|1].c=max(tr[k<<1|1].c,tr[k].c+tr[k<<1|1].a); tr[k<<1|1].d=max(tr[k].d,max(tr[k<<1|1].d,tr[k<<1|1].b+tr[k].c)); tr[k<<1|1].a=max(-inf,tr[k].a+tr[k<<1|1].a); tr[k<<1|1].b=max(tr[k<<1|1].b+tr[k].a,tr[k].b); tr[k].a=tr[k].b=tr[k].c=tr[k].d=0; } void modify(int k,int l,int r,int x,int y,ll a,ll b) { if(l>=x&&r<=y) { tr[k].a=max(-inf,tr[k].a+a); tr[k].b=max(tr[k].b+a,b); tr[k].c=max(tr[k].a,tr[k].c); tr[k].d=max(tr[k].b,tr[k].d); return ; } int mid=(l+r)>>1;pushdown(k); if(x<=mid)modify(k<<1,l,mid,x,y,a,b); if(y>mid)modify(k<<1|1,mid+1,r,x,y,a,b); } inline ll query(int x) { register int l=1,r=n,mid,k=1; while(l<r) { mid=(l+r)>>1;pushdown(k); x<=mid?(k<<=1,r=mid):(k=k<<1|1,l=mid+1); } return max(tr[k].a,tr[k].b); } inline ll query_mx(int x) { register int l=1,r=n,mid,k=1; while(l<r) { mid=(l+r)>>1;pushdown(k); x<=mid?(k<<=1,r=mid):(k=k<<1|1,l=mid+1); } return max(tr[k].c,tr[k].d); } void build(int k,int l,int r) { if(l==r){tr[k].a=tr[k].c=read();return ;} int mid=(l+r)>>1; build(k<<1,l,mid);build(k<<1|1,mid+1,r); } int main() { n=read();int Q=read(); build(1,1,n); register int opt,x,y,val; while(Q--) { opt=read();x=read(); switch(opt) { case 1:y=read(),val=read();modify(1,1,n,x,y,val,0);break; case 2:y=read(),val=read();modify(1,1,n,x,y,-val,0);break; case 3:y=read(),val=read();modify(1,1,n,x,y,-inf,val);break; case 4:print(query(x));puts("");break; case 5:print(query_mx(x));puts("");break; } } return 0; } /* 5 6 1 2 3 4 5 2 1 3 2 4 1 1 1 4 1 5 3 3 1 5 4 4 2 0 3 4 */
相关文章推荐
- uoj164. 【清华集训2015】V
- UOJ #164. 【清华集训2015】V | 线段树
- #164. 【清华集训2015】V
- UOJ【清华集训2015】V
- 【BZOJ5117】【UOJ164】【清华集训2015】V
- #164. 【清华集训2015】V
- #164. 【清华集训2015】V
- UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】
- uoj#158. 【清华集训2015】静态仙人掌
- [历史最值线段树] UOJ#164. 【清华集训2015】V
- uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题
- 【UOJ】#273. 【清华集训2016】你的生命已如风中残烛
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
- uoj164. 【清华集训2015】V 统计
- 【XSY1284】【BZOJ3813】【清华集训2014】奇数国 线段树 数学
- uoj#274. 【清华集训2016】温暖会指引我们前行 //LCT
- 清华集训2015 V
- bzoj 3816&&uoj #41. [清华集训2014]矩阵变换
- [清华集训2015]V