Wannafly挑战赛10 D 小H的询问(线段树)
题目链接 Problem D
这个题类似 SPOJ GSS3
做过那个题之后其实就可以秒掉这题了。
考虑当前线段树维护的结点
在那道题的基础上,这个题要多维护几个东西,大概就是左端点的奇偶性,右端点的奇偶性。
以及当前结点代表的区间是否是一个有效的子序列。
时间复杂度$O(nlogn)$
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define ls i << 1
- #define rs i << 1 | 1
- #define mid ((l + r) >> 1)
- #define lson ls, l, mid
- #define rson rs, mid + 1, r
- typedef long long LL;
- const int N = 1e5 + 10;
- struct node{
- LL c, lc, rc, ret;
- int lo, ro, flag;
- } t[N << 2];
- int n, m;
- void pushup(int i){
- t[i].c = t[ls].c + t[rs].c;
- t[i].ret = max(t[ls].ret, t[rs].ret);
- t[i].flag = 0;
- t[i].lc = t[ls].lc;
- t[i].rc = t[rs].rc;
- t[i].lo = t[ls].lo;
- t[i].ro = t[rs].ro;
- if (t[ls].ro ^ t[rs].lo){
- t[i].ret = max(t[i].ret, t[ls].rc + t[rs].lc);
- if (t[ls].flag) t[i].lc = max(t[i].lc, t[ls].c + t[rs].lc);
- if (t[rs].flag) t[i].rc = max(t[i].rc, t[rs].c + t[ls].rc);
- if (t[ls].flag && t[rs].flag) t[i].flag = 1;
- }
- }
- void build(int i, int l, int r){
- if (l == r){
- scanf("%lld", &t[i].ret);
- t[i].c = t[i].lc = t[i].rc = t[i].ret;
- t[i].lo = t[i].ro = (t[i].ret & 1);
- t[i].flag = 1;
- return;
- }
- build(lson);
- build(rson);
- pushup(i);
- }
- void update(int i, int l, int r, int x, LL val){
- if (l == x && l == r){
- t[i].ret = t[i].c = t[i].lc = t[i].rc = val;
- t[i].lo = t[i].ro = (val & 1);
- t[i].flag = 1;
- return;
- }
- if (x <= mid) update(lson, x, val);
- else update(rson, x, val);
- pushup(i);
- }
- node query(int i, int l, int r, int L, int R){
- if (L <= l && r <= R) return t[i];
- if (R <= mid) return query(lson, L, R);
- if (L > mid) return query(rson, L, R);
- node ta = query(lson, L, mid);
- node tb = query(rson, mid + 1, R);
- node ans;
- ans.c = ta.c + tb.c;
- ans.ret = max(ta.ret, tb.ret);
- ans.flag = 0;
- ans.lc = ta.lc;
- ans.rc = tb.rc;
- ans.lo = ta.lo;
- ans.ro = tb.ro;
- if (ta.ro ^ tb.lo){
- ans.ret = max(ans.ret, ta.rc + tb.lc);
- if (ta.flag) ans.lc = max(ans.lc, ta.c + tb.lc);
- if (tb.flag) ans.rc = max(ans.rc, tb.c + ta.rc);
- if (ta.flag && tb.flag) ans.flag = 1;
- }
- return ans;
- }
- int main(){
- scanf("%d%d", &n, &m);
- build(1, 1, n);
- while (m--){
- int op;
- scanf("%d", &op);
- if (op == 0){
- int x, y;
- scanf("%d%d", &x, &y);
- node ans = query(1, 1, n, x, y);
- printf("%lld\n", ans.ret);
- }
- else{
- int x;
- LL y;
- scanf("%d%lld", &x, &y);
- update(1, 1, n, x, y);
- }
- }
- return 0;
- }
Wannafly挑战赛10 D 小H的询问(线段树)的更多相关文章
- Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)
Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...
- 【牛客Wannafly挑战赛12】小H和圣诞树
题目 可以考虑边分治,对于某一种颜色,我们处理出分治边左右两边所有以这个颜色为端点的路径长度,之后随便拼一拼就好了 但是这样对于每一组询问都需要边分一遍,这样做复杂度是\(O(nm+n\log n)\ ...
- 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)
[Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...
- 【Wannafly挑战赛10 - B】小H和密码(DP)
试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述 小H在击败怪兽后,被一个密码锁挡住了去路 密码锁由N个转盘组成,编号为1~N,每 ...
- Wannafly挑战赛10:A题:小H和迷宫
题目描述 小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%.b%.c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使 ...
- BZOJ 3065 带插入区间K小值(sag套线段树)
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 4696 Solved: 1527[Submit][Status][Di ...
- SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...
- 树上第k小,可持久化线段树+倍增lca
给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...
随机推荐
- jQuery监控动画执行完毕事件
$('#yourElement').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend' ...
- 详解zabbix2.2.2安装部署(Server端篇)
今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置 Linux安装:http://www.osyunwei.com/archives/10 ...
- 自动化测试(二)如何用python写一个用户登陆功能
需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...
- jmeter运行脚本后,请求偶发性的传参错误
问题现象:jmeter写好脚本后,请求偶发性的传参错误 排查过程:1.结合报错返回值,看是不是线程并发引起: 2.排除线程并发引起后,看看是不是取值策略:如果是参数化,看看是不是每次迭代,每次都取唯一 ...
- leetcode 208. 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert(" ...
- django QuerySet 的常用API
为了加深对queryset对象api的了解,我们建立了以下示例模型: from django.db import models class Author(models.Model): "&q ...
- HDU 4116 Fruit Ninja ( 计算几何 + 扫描线 )
给你最多1000个圆,问画一条直线最多能与几个圆相交,相切也算. 显然临界条件是这条线是某两圆的公切线,最容易想到的就是每两两圆求出所有公切线,暴力判断一下. 可惜圆有1000个,时间复杂度太高. 网 ...
- 普通用户操作tomcat项目时报:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
在使用普通用户更新tomcat项目适合出现这个信息,Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 E: IQ(iq)
http://acm.ocrosoft.com/problem.php?cid=1316&pid=4 题目描述 根据世界某权威学会的一项调查,学信息学的学生IQ非常高.举个最好的例子,如果我们 ...
- qemu中是怎么模拟的新的设备
kvm_cpu_exec 和demo中演示的一样