【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的广告,要求把广告贴 ...
随机推荐
- 转 linux任务调度之crontab命令
crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. 在 ...
- unittest (python标准库-开发工具-单元测试框架)
unittest官方文档摘录 翻译 reffer to: https://docs.python.org/3/library/unittest.html#unittest.TextTestRunner ...
- zlib stream
官方帮助手册 http://www.zlib.net/manual.html #include <stdlib.h> #include <string.h> #incl ...
- SQL语句原理与高效SQL语句(转)
做软件开发的programers,大部分都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么还能保证下一段时间系统还能流畅的运行 ...
- MySQL 中的 base64 函数
1. 5.6版本及之后的版本的base64 主要就是两个mysql内部函数to_base64和from_base64,使用也很简单,如下: 5.6之前不支持 mysql> select vers ...
- ANDROID模拟器访问本地WEB应用10.0.2.2
在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正 ...
- RS-232
RS-232 锁定 同义词 rs232一般指RS-232 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . 个人计算机上的通讯接口之一,由电子工业协会(Electronic Industr ...
- CURL简单使用
学习地址:https://yq.aliyun.com/articles/33262 curl的简单使用步骤 要使用cURL来发送url请求,具体步骤大体分为以下四步: 1.初始化2.设置请求选项3.执 ...
- oracle调优 浅析“会话管理开销”
调优之浅析"会话管理开销" [简单介绍] 在调优的过程中,对于会话的管理是比較普遍的问题,由于维护会话的开销相对是比較高的. [过程表现例如以下] ...
- 8.使用JPA保存数据【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51636989 在看这一篇文档的话,需要先配置好JPA – hibernate. 总体步骤: ...