链接:http://acm.hdu.edu.cn/showproblem.php?

pid=5316

Magician

Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 190    Accepted Submission(s): 54

Problem Description
Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an innate talent, gaining it through study and practice, or receiving it from another being, often a god, spirit, or demon of some sort. Some wizards are depicted
as having a special gift which sets them apart from the vast majority of characters in fantasy worlds who are unable to learn magic.



Magicians, sorcerers, wizards, magi, and practitioners of magic by other titles have appeared in myths, folktales, and literature throughout recorded history, with fantasy works drawing from this background.



In medieval chivalric romance, the wizard often appears as a wise old man and acts as a mentor, with Merlin from the King Arthur stories representing a prime example. Other magicians can appear as villains, hostile to the hero.








Mr. Zstu is a magician, he has many elves like dobby, each of which has a magic power (maybe negative). One day, Mr. Zstu want to test his ability of doing some magic. He made the elves stand in a straight line, from position 1 to position n, and he used two
kinds of magic, Change magic and Query Magic, the first is to change an elf’s power, the second is get the maximum sum of beautiful subsequence of a given interval. A beautiful subsequence is a subsequence that all the adjacent pairs of elves in the sequence
have a different parity of position. Can you do the same thing as Mr. Zstu ?


 
Input
The first line is an integer T represent the number of test cases.

Each of the test case begins with two integers n, m represent the number of elves and the number of time that Mr. Zstu used his magic.

(n,m <= 100000)

The next line has n integers represent elves’ magic power, magic power is between -1000000000 and 1000000000.

Followed m lines, each line has three integers like 

type a b describe a magic.

If type equals 0, you should output the maximum sum of beautiful subsequence of interval [a,b].(1 <= a <= b <= n)

If type equals 1, you should change the magic power of the elf at position a to b.(1 <= a <= n, 1 <= b <= 1e9)
 
Output
For each 0 type query, output the corresponding answer.
 
Sample Input
1
1 1
1
0 1 1
 
Sample Output
1
 

题意:有n个数。两个操作,0操作,输出l到r 。全部奇偶交替 的子序列中。值的最大和。

(自序列是能够不用连续的)。 1操作是把a位置的数改成b。

做法:维护区间内的

jiou,  这个区间以奇数位開始,偶数位结束的 全部子序列中的最大和。

ouji,jiji。ouou 三个数同理。

#include <cstdio>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std; #define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define LL __int64
#define inf -100000000000000000 const int maxn = 111111;
struct point
{
__int64 jiji,ouou,jiou,ouji;
}; point pp[maxn<<2];
int jiou[maxn<<2]; point big(point a,point b)
{
point c;
c.jiji=max(a.jiji,b.jiji);
c.jiji=max(c.jiji,a.jiji+b.ouji);
c.jiji=max(c.jiji,a.jiou+b.jiji);
c.jiji=max(c.jiji,inf); c.jiou=max(a.jiou,b.jiou);
c.jiou=max(c.jiou,a.jiji+b.ouou);
c.jiou=max(c.jiou,a.jiou+b.jiou);
c.jiou=max(c.jiou,inf); c.ouji=max(a.ouji,b.ouji);
c.ouji=max(c.ouji,a.ouji+b.ouji);
c.ouji=max(c.ouji,a.ouou+b.jiji);
c.ouji=max(c.ouji,inf); c.ouou=max(a.ouou,b.ouou);
c.ouou=max(c.ouou,a.ouji+b.ouou);
c.ouou=max(c.ouou,a.ouou+b.jiou);
c.ouou=max(c.ouou,inf);
return c;
} void PushUp(int rt) {
pp[rt]=big(pp[rt<<1],pp[rt<<1|1]);
} int kk=1;
void build(int l,int r,int rt) {
if (l == r) {
if(kk&1)
{
jiou[rt]=1;
scanf("%I64d",&pp[rt].jiji);
pp[rt].ouou=inf;
pp[rt].ouji=inf;
pp[rt].jiou=inf;
}
else
{
jiou[rt]=0;
scanf("%I64d",&pp[rt].ouou);
pp[rt].jiou=pp[rt].jiji=pp[rt].ouji=inf;
}
kk++;
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUp(rt);
}
void update(int L,int c,int l,int r,int rt) {
if (l==r&&l==L) {
if(jiou[rt]==1)
pp[rt].jiji=c;
if(jiou[rt]==0)
pp[rt].ouou=c;
return ;
}
int m = (l + r) >> 1;
if (L <= m) update(L , c , lson);
else
update(L , c , rson);
PushUp(rt);
}
point query(int L,int R,int l,int r,int rt) {
if (L <= l && r <= R) {
return pp[rt];
} int m = (l + r) >> 1; if(L<=m&&m<R) return big( query(L , R , lson),query(L , R , rson));
if(L<=m) return query(L , R , lson);
if(m<R) return query(L , R , rson); }
int main() {
int t;
int n,q;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&q);
kk=1;
if(n)
build(1 , n , 1);
while(q--)
{
int op;
int a,b;
scanf("%d",&op);
scanf("%d%d",&a,&b);
if(n==0)
{
if(op==0)
puts("0");
continue;
} if(op==0)
{
if(a>b)
swap(a,b);
point ppp=query(a,b,1,n,1);
printf("%I64d\n",max(ppp.jiji,max(ppp.jiou,max(ppp.ouji,ppp.ouou))));
}
else
update(a , b , 1 , n , 1);
}
}
return 0;
}

hdu 5316 Magician 线段树的更多相关文章

  1. hdu 5316 Magician 线段树维护最大值

    题目链接:Magician 题意: 给你一个长度为n的序列v,你需要对这个序列进行m次操作,操作一共有两种,输入格式为 type a b 1.如果type==0,你就需要输出[a,b]区间内的美丽序列 ...

  2. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  3. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  4. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. HDU 5316——Magician——————【线段树区间合并区间最值】

    Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  6. HDU 5316 Magician (线段树,单值修改,微变形)

    题意:给一个初始序列A[1,n],第j个数字代表精灵j的power值,有两种操作:(1)查询区间[L,R] (2)修改某个精灵的power值. 但,查询的是区间[L,R]中一个美丽子序列sub[l,r ...

  7. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  8. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  9. HDU 2795 Billboard (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告;   然后给n个1*wi的广告,要求把广告贴 ...

随机推荐

  1. 【转】Building a RESTful Web Service

    目标 构建一个service,接收如下HTTP GET请求: [plain] view plain copy   http://localhost:8080/greeting 并返回如下JSON格式的 ...

  2. Nginx+PHPSTORM+Xdebug 配置

    1. php Xdebug扩展 下载  https://xdebug.org/download.php 选择自己的版本下载,会得到一个dll文件 例如 php_xdebug-2.7.0alpha1-7 ...

  3. 【Luogu】P3761城市(dfs)

    题目链接 emmm我思维好水…… 想了一会lct发现好像不对,然后开始转DP稍微有一点思路,然后看了题解…… 首先可以枚举边,然后原树被你拆成了两个子树. 设D1D2是两个子树的直径,W1W2是子树内 ...

  4. 基于openstack stable queens版本阅读解析

    基于openstack stable queens版本阅读解析 基于 centos7.5 的linux系统 架构 如下所示,为cinder的官方架构说明: 这里写图片描述 各个组件介绍如下: - DB ...

  5. BZOJ 4551 [Tjoi2016&Heoi2016]树 ——并查集

    树剖显然可以做. 然而有一种更神奇的方法,并查集+时光倒流. 每个节点指向它上面最近的标记节点,标记节点指向自己,然后删除标记,就可以用并查集查询了. #include <map> #in ...

  6. BZOJ2653 middle 【二分 + 主席树】

    题目 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c ...

  7. 【CCF】高速公路 tarjan强连通缩点

    [题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...

  8. windows7下如何生成ssh公钥(git相关)

    1. 安装git,从程序目录打开 "Git Bash"  2. 键入命令:ssh-keygen -t rsa -C "email@email.com"   &q ...

  9. 捕获错误并发邮件 register_shutdown_function

    /** * 脚本程序异常捕获 */ function handleError() { global $config; $error = error_get_last(); if (isset($err ...

  10. iOS-开发者账号失效后是否还可以打包

    参考链接:https://www.jianshu.com/p/601f596e8550