hdu 5316 Magician 线段树
链接: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
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 ?
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)
1
1 1
1
0 1 1
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 线段树的更多相关文章
- 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的广告,要求把广告贴 ...
随机推荐
- Jeddict:怎样在window系统下,成功打包Angular
在Jeddict的应用过程中,发现了一个问题.如果前端视图选择Angular(具体版本,需要根据插件版本确定.此处理解为非Angular JS),那么在自动构建的过程中,会发现,每当在安装NodeJS ...
- POJ #1025 Department
模拟题. 这题第一个障碍是现在少见的循环电梯 ('pater-noster' elevator) "The building has `pater-noster' elevator, i.e ...
- linux查找文件命令
(2)find /etc -name httpd.conf #在/etc目录下文件httpd.conf
- 剑指Offer 二进制中一的个数
链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8 来源:牛客网 public class So ...
- [leetcode] permutations 排列
写了两个,一个是直接的递归实现: class Solution { public: void swap(vector<int> &num,int left,int right) { ...
- 标准C程序设计七---113
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- Definition vs declaration
#include <stdio.h> union test1; // declaration union test2 { // The definition of union test2 ...
- iOS8下定位问题解决
项目是以前iOS7的,升级iOS8后,无法成功获取用户位置.后来才发现iOS8 使用定位需要在infoplist文件中加2个key,然后manager需要加一个方法,指定定位授权机制 在plist ...
- Laravel 5.1 关掉csrf验证
Laravel 5.1 关掉csrf验证 说明: Laravel默认是开启了CSRF功能,有时可能不能传递验证token,就需要关闭. 方法一(全局关闭): 打开文件:app\Http\Kernel. ...
- yii框架缓存知识总结(转载)
缓存是用于提升网站性能的一种即简单又有效的途径.稍微有点规模的网站都会通过存储相对静态的数据至缓存以备所需,这样我们可以省去从数据库查询然后生成这些数据的时间,通过减轻数据库的压力从而提升网站的性能. ...