链接: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. 【Luogu】P4363一双木棋(状压爆搜)

    题目链接 唉,只有AC了这道题才会感叹考场上没有想出解法的我是多么智障. 我甚至连任何想法都没有. 天啊我当时到底在想些什么. AC这道题我就能进前15了诶. 我们发现只要确定了轮廓线那么此时的状态就 ...

  2. 深入浅出mysql全文随笔

    进入mysql :mysql -uroot -p 1.DDL(Data Definition Languages)语句:数据定义语言 2.DML(Data Manipulation Language) ...

  3. cf 472G Design Tutorial: Increase the Constraints 分块+压位/FFT

    题目大意 给出两个\(01\)序列\(A\)和\(B\) 哈明距离定义为两个长度相同的序列中,有多少个对应位置上的数字不一样 "00111" 和 "10101" ...

  4. poj 3708 Recurrent Function

    Recurrent Function Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1233   Accepted: 336 ...

  5. 选择员工要有3S能力

    企业的核心竞争力依托于高素质的员工.不断地对员工进行培训.提升并管理好员工,是让企业持续散发活力的一剂良药. 在企业里,有个说法叫三个房子有一个柱子,第一个是以人为本,怎么样吸引最优秀的员工:第二个是 ...

  6. 【CF733F】Drivers Dissatisfaction(最小瓶颈生成树,倍增)

    题意:给出一个图,每条边有权值和花费c,每次花费c能使的权值-1.给出一个预算,求减完权值后的一个最小生成树. 思路:感谢CC大神 有这样一个结论:最佳方案里必定存在一种,预算全部花费全部分配在一条边 ...

  7. 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..

    https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...

  8. 卸载重安firefox

    把firefox完全卸载掉重装: 查看安装的firefox版本: dpkg --get-selections |grep firefox 根据命令结果卸载重装 比如: $ dpkg --get-sel ...

  9. 标准C程序设计七---66

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  10. C#读取Excel 几种方法的体会

    (1) OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不太灵活,不过可以在 DataTable 中对数据进行一些删减修改 这种方式将Excel作为一个数据源,直接用 ...