hdu5316 Magician(线段树区间合并)
2015-09-01 17:40
423 查看
题意:
T组数据
n个数,m个操作,0表示把位置a上的数改成b,1表示求区间[a,b]的最大的美丽子串和
美丽子串:相邻元素下标奇偶性不同,序列可不连续。
T组数据
n个数,m个操作,0表示把位置a上的数改成b,1表示求区间[a,b]的最大的美丽子串和
美丽子串:相邻元素下标奇偶性不同,序列可不连续。
#include<iostream> #include<cstdio> #include<cstring> #define LL __int64 #define lson rt<<1 #define rson rt<<1|1 using namespace std; const int N=100100; const LL INF=0x3f3f3f3f3f3f3f3f; //子序列情况:奇始奇终、奇始偶终、偶始奇终、偶始偶终 struct Node { int l,r; LL oo,ee,oe,eo; int Mid(){return (l+r)/2;} }tree[4*N]; LL num ; LL Max(LL a,LL b) { return a<b ?b :a; } void pushUp(int rt) { LL a=tree[lson].oe+tree[rson].oe; LL b=tree[lson].eo+tree[rson].eo; LL c=tree[lson].ee+tree[rson].oo; LL d=tree[lson].oo+tree[rson].ee; LL e=tree[lson].oe+tree[rson].oo; LL f=tree[lson].oo+tree[rson].eo; LL g=tree[lson].ee+tree[rson].oe; LL h=tree[lson].eo+tree[rson].ee; tree[rt].oe=Max(Max(a,d),Max(tree[lson].oe,tree[rson].oe)); tree[rt].eo=Max(Max(b,c),Max(tree[lson].eo,tree[rson].eo)); tree[rt].oo=Max(Max(e,f),Max(tree[lson].oo,tree[rson].oo)); tree[rt].ee=Max(Max(g,h),Max(tree[lson].ee,tree[rson].ee)); } Node query(int rt,int l,int r) { Node temp,t1,t2; if(tree[rt].l==l&&tree[rt].r==r){ temp.eo=tree[rt].eo; temp.ee=tree[rt].ee; temp.oe=tree[rt].oe; temp.oo=tree[rt].oo; return temp; } if(r<=tree[rt].Mid()){ return query(lson,l,r); } else if(l>tree[rt].Mid()){ return query(rson,l,r); } else{ t1=query(lson,l,tree[rt].Mid()); t2=query(rson,tree[rt].Mid()+1,r); temp.oe=Max(Max(t1.oe+t2.oe,t1.oo+t2.ee),Max(t1.oe,t2.oe)); temp.eo=Max(Max(t1.eo+t2.eo,t1.ee+t2.oo),Max(t1.eo,t2.eo)); temp.oo=Max(Max(t1.oe+t2.oo,t1.oo+t2.eo),Max(t1.oo,t2.oo)); temp.ee=Max(Max(t1.eo+t2.ee,t1.ee+t2.oe),Max(t1.ee,t2.ee)); return temp; } } void update(int rt,int x,int v) { if(tree[rt].l==x&&tree[rt].r==x){ if(x&1){ tree[rt].oo=v; } else{ tree[rt].ee=v; } return; } if(x<=tree[rt].Mid()){ update(2*rt,x,v); } else{ update(2*rt+1,x,v); } pushUp(rt); } void build(int rt,int l,int r) { tree[rt].l=l;tree[rt].r=r; if(l==r){ if(l&1){ tree[rt].oo=num[l]; tree[rt].ee=-INF; } else{ tree[rt].oo=-INF; tree[rt].ee=num[l]; } tree[rt].eo=-INF; tree[rt].oe=-INF; return; } int mid=(l+r)/2; build(2*rt,l,mid); build(2*rt+1,mid+1,r); //向上合并 pushUp(rt); } int main() { //freopen("d:\\Test.txt","r",stdin); int T; int n,m; LL ans; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%I64d",&num[i]); } build(1,1,n); for(int i=1;i<=m;i++){ int op,a,b; scanf("%d%d%d",&op,&a,&b); if(op==0){ Node res=query(1,a,b); ans=Max(Max(res.ee,res.oo),Max(res.eo,res.oe)); printf("%I64d\n",ans); } else if(op==1){ update(1,a,b); } } } return 0; }
相关文章推荐
- Apriori算法——深度剖析及源码实现
- 【MFC】指纹类型识别(OpenCV + MATLAB混合编程)
- C语言中fchdir()函数和rewinddir()函数的使用详解
- 学习Rational Unified Process的一些心得
- 解析Cloudera Manager内部结构、功能包括配置文件、目录位置等
- Android 屏幕适配方式
- 浏览器 CSS Hack 收集
- Ajax学习整理
- JSTL标签 参考手册
- Spark学习笔记之-Spark on yarn(动态资源调度)
- 相关博文链接
- navigationController隐藏问题
- 软工之开发阶段
- 【AngularJS】—— 9 自定义过滤器
- 全面解析java注解
- nginx servername配置域名网站可以正常登录,servername配置IP+Port却无法正常登录
- 支持Android4.0以下webp的使用
- HDU 3345 war chess(bfs + 优先队列)
- 省市县联查 三级联动
- UVa 11059