【HDU 5316】Magician(线段树)
一開始度错题了,题意是求一段和最大的【子序列】,要求相邻两个元素的位置必须互为奇偶。
这样我们能够使用线段树维护4个值:
一段区间内开头结尾元素为:
奇奇
奇偶
偶奇
偶偶
的最大值
之后在pushup的的时候依据题目所给的意思进行合并。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson (pos<<1)
#define rson (pos<<1|1)
typedef long long LL;
const int maxn = 100005;
const LL INF = 9999999999999999LL;
int n,m;
struct Node{
LL oe;
LL oo;
LL ee;
LL eo;
}node[maxn << 2];
LL value[maxn];
Node pushnode(Node p,Node q){
Node newNode;
newNode.oe = max(max(p.oe,q.oe),max(p.oo + q.ee,p.oe + q.oe));
newNode.oo = max(max(p.oo,q.oo),max(p.oo + q.eo,p.oe + q.oo));
newNode.ee = max(max(p.ee,q.ee),max(p.eo + q.ee,p.ee + q.oe));
newNode.eo = max(max(p.eo,q.eo),max(p.eo + q.eo,p.ee + q.oo));
return newNode;
}
void pushup(int pos){
node[pos].oe = max(max(node[lson].oe,node[rson].oe),max(node[lson].oo + node[rson].ee,node[lson].oe + node[rson].oe));
node[pos].oo = max(max(node[lson].oo,node[rson].oo),max(node[lson].oo + node[rson].eo,node[lson].oe + node[rson].oo));
node[pos].ee = max(max(node[lson].ee,node[rson].ee),max(node[lson].eo + node[rson].ee,node[lson].ee + node[rson].oe));
node[pos].eo = max(max(node[lson].eo,node[rson].eo),max(node[lson].eo + node[rson].eo,node[lson].ee + node[rson].oo));
}
void build(int l,int r,int pos){
if(l == r){
if(l & 1){
node[pos].oe = node[pos].ee = node[pos].eo = -INF;
node[pos].oo = value[l];
}
else{
node[pos].oe = node[pos].oo = node[pos].eo = -INF;
node[pos].ee = value[l];
}
return;
}
int mid = (l + r) >> 1;
build(l,mid,lson);
build(mid + 1,r,rson);
pushup(pos);
}
void update(int l,int r,int pos,int to,int v){
if(l == r){
if(l & 1){
node[pos].oe = node[pos].ee = node[pos].eo = -INF;
node[pos].oo = v;
}
else{
node[pos].oe = node[pos].oo = node[pos].eo = -INF;
node[pos].ee = v;
}
return;
}
int mid = (l + r) >> 1;
if(to <= mid)
update(l,mid,lson,to,v);
else
update(mid + 1,r,rson,to,v);
pushup(pos);
}
Node query(int l,int r,int L,int R,int pos){
if(L <= l && r <= R){
return node[pos];
}
int mid = (l + r) >> 1;
if(R <= mid)
return query(l,mid,L,R,lson);
else if(L > mid)
return query(mid + 1,r,L,R,rson);
else{
Node v1 = query(l,mid,L,R,lson);
Node v2 = query(mid + 1,r,L,R,rson);
return pushnode(v1,v2);
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++){
scanf("%I64d",&value[i]);
}
build(1,n,1);
for(int i = 0; i < m; i++){
int op;
LL a,b;
scanf("%d%I64d%I64d",&op,&a,&b);
if(op == 0){
Node nans = query(1,n,a,b,1);
LL ans = max(max(nans.oo,nans.eo),max(nans.ee,nans.oe));
printf("%I64d\n",ans);
}
else if(op == 1)
update(1,n,1,a,b);
}
}
return 0;
}
【HDU 5316】Magician(线段树)的更多相关文章
- hdu 5316 Magician 线段树
链接:http://acm.hdu.edu.cn/showproblem.php? pid=5316 Magician Time Limit: 18000/9000 MS (Java/Others) ...
- hdu 5316 Magician 线段树维护最大值
题目链接:Magician 题意: 给你一个长度为n的序列v,你需要对这个序列进行m次操作,操作一共有两种,输入格式为 type a b 1.如果type==0,你就需要输出[a,b]区间内的美丽序列 ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 5316——Magician——————【线段树区间合并区间最值】
Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 5316 Magician (线段树,单值修改,微变形)
题意:给一个初始序列A[1,n],第j个数字代表精灵j的power值,有两种操作:(1)查询区间[L,R] (2)修改某个精灵的power值. 但,查询的是区间[L,R]中一个美丽子序列sub[l,r ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- HDU 2795 Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴 ...
随机推荐
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- PostgreSQL(EXCEPT,INTERSECT)
except 可以查看表一对表二不一样的数据,有点像是对表一进行表一表二交集的反集的交集,好绕: intersect 可以查看表一和表二一样的数据,求交集: select t1.name,t1.age ...
- (1)oracle安装、卸载、启动、关闭、登陆以及同时遇到的问题
数据库概念 在oracle里数据库是一个静态的概念,数据库的资料保存在硬盘上,一个数据库可以有多个实例 数据库实例 数据库实例是一个动态的概念,它是进程+这个进程的内存块.就把它当成个指针吧,这个指针 ...
- Codeforces Round #166 (Div. 2) A. Beautiful Year【暴力枚举/逆向思维/大于当前数且每个位数不同】
A. Beautiful Year time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 链式前向星BFS
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5399068 采用链式前向星的BFS: #include <iostream> #incl ...
- luogu P1091 合唱队形
题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...
- 十. 图形界面(GUI)设计2.框架窗口
窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用.有以下三种窗口: Applet窗口:Applet类管理这 ...
- c#作业(2班)
第二章 1.编写一个控制台程序,要求: 接受从控制台输入的姓名,如:张三 程序响应:你好,张三. 在代码中使用规范的注释,说明程序的功能 编译程序,并执行. 程序执行效果如下图: using Syst ...
- MySQL索引,MySQL中索引的限制?
MySQL中索引的限制: 1.MyISAM存储引擎引键的长度综合不能超过1000字节: 2.BLOB和TEXT类型的列只能创建前缀索引: 3.MySQL目前不支持函数索引: 4.使用!= 或者< ...
- ios unit test 工程选择release时候报错Undefined symbols for architecture i386
Undefined symbols for architecture i386: "_OBJC_CLASS_$_ItemReturn", referenced from: objc ...