【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的广告,要求把广告贴 ...
随机推荐
- Ext中点击某个东西弹出框展示
renderer:function(v){ return '<a href="123" data-qtitle="OK Button" data-qwid ...
- HDU-6315 Naive Operations//2018 Multi-University Training Contest 2___1007 (线段树,区间除法)
原题地址 Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/ ...
- IO模型同步与异步阻塞与非阻塞的区别
同步异步的区别 关注点:同步和异步关注的是消息通信机制 同步:所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主 ...
- ARM常用汇编指令介绍
b 跳转指令(跳转范围为32Mb) bl 带返回地址的跳转,指令自动将下一条指令的地址复制到R14寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行 pc 寄存器R1 ...
- Ubuntu 16.04桌面版GUI网络配置工具NetworkManager的命令行工具nm-tool无法使用的问题
说明: 1.Ubuntu中分桌面版和服务器版,而这两个版本在网络管理方面使用的工具都不一样,尤其是在桌面版,使用了NetworkManager进行管理. 2.服务器版使用的是命令行配置,而桌面版包含了 ...
- Xcode 5 单元测试(二)OCMock和GHUnit
在Xcode 5 单元测试(一)使用XCTest进行单元测试中说了如何在Xcode 5中使用XCTest进行简单的单元测试,本文就来探讨下mock测试和更高级的工具GHUnit. Mock 首先科普下 ...
- 【微信】2.微信小程序开发--官方开发工具使用说明
承接第一篇 =============================================== 关于微信小程序开发使用IDE,曾经自己动摇过. 到底是采用 微信官方小程序开发工具 WebS ...
- iptables利用connlimit模块限制同一IP连接数
connlimit功能: connlimit模块允许你限制每个客户端IP的并发连接数,即每个IP同时连接到一个服务器个数. connlimit模块主要可以限制内网用户的网络使用,对服务器而言则可以限制 ...
- Ubuntu系统日志
一.指定系统日志路径到: /var/log/messages 1.默认系统日志 root@HDController:~# tail -1000 /var/log/syslog Oct 20 06:2 ...
- @Component-@Resource-@Repository-@Service-@Controller的区别和理解-------springMVC
1.作用: @Component------------------------泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注.(Component-------成分; 组分; 零件) ...