CODEVS-2018-反病毒软件-线段树
描述
两种操作:
1. (1, x, y) 表示 x 点权值增加 y
2. (2, x, y) 表示求 [x, y] 区间的最大值与次大值的差.
分析
- 可以采用线段树
- 对于操作1, 就是单点修改
- 操作2, 先找到区间最大值, 然后把这个点清零, 再求一遍区间最大值. 相减输出. 最后单点修改改回原状态.
- 有许多细节需要注意.
代码
#include #include using namespace std;
const int INF = 1000000000;
const int maxn = 100000 + 10;
struct SegmentTree {
int n;
int x, y1, y2, d, p, q;
int maxv[maxn<<2];
#define lc (o<<1)
#define rc (o<<1^1)
#define M (L+R>>1)
void update(int o) {
maxv[o] = max(maxv[lc], maxv[rc]);
}
void modify(int o, int L, int R) {
if(L == R) { maxv[o] += d; return; }
if(x <= M) modify(lc, L, M); else modify(rc, M+1, R);
update(o);
}
void query1(int o, int L, int R) {
if(y1 <= L && R <= y2) {
if(d < maxv[o]) d = maxv[o], p = L, q = R;
return;
}
if(y1 <= M) query1(lc, L, M);
if(y2 > M) query1(rc, M+1, R);
}
int query2(int o, int L, int R) {
if(y1 <= L && R <= y2) return maxv[o];
int ret = 0;
if(y1 <= M) ret = max(ret, query2(lc, L, M));
if(y2 > M) ret = max(ret, query2(rc, M+1, R));
return ret;
}
int remove(int o, int L, int R) {
if(L == R) { maxv[o] = 0; return L; }
int ret = (maxv[lc] == d ? remove(lc, L, M) : remove(rc, M+1, R));
update(o);
return ret;
}
void find(int o, int L, int R) {
if(L == p && R == q) { x = remove(o, L, R); return; }
int ret = 0;
if(!x && p <= M && maxv[lc] >= d) find(lc, L, M);
if(!x && q > M && maxv[rc] >= d) find(rc, M+1, R);
update(o);
}
void Modify() {
modify(1, 1, n);
}
void Query() {
d = 0; x = 0;
query1(1, 1, n);
if(!d) { printf("0\n"); return; }
find(1, 1, n);
printf("%d\n", d-query2(1, 1, n));
modify(1, 1, n);
}
} seg;
int main()
{
int n, m;
scanf("%d %d", &n, &m);
seg.n = n;
for(int i = 1; i <= m; i++) {
int q, x, y;
scanf("%d %d %d", &q, &x, &y);
if(q == 1) {
seg.x = x;
seg.d = y;
seg.Modify();
} else {
seg.y1 = x;
seg.y2 = y;
seg.Query();
}
}
return 0;
}
CODEVS-2018-反病毒软件-线段树相关推荐
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
- 2018.07.11 线段树基本模板复习
白天听了一天的dpdp,晚上复习一下线段树的板子 //线段树维护区间增加(减少),区间最大值,区间最小值,区间和 #include<bits/stdc++.h>//宏命令替换常量和左右儿子 ...
- [九省联考2018]IIIDX 贪心 线段树
~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...
- 洛谷P4364 [九省联考2018]IIIDX(线段树)
传送门 题解看得--很--迷? 因为取完一个数后,它的子树中只能取权值小于等于它的数.我们先把权值从大到小排序,然后记$a_i$为他左边(包括自己)所有取完他还能取的数的个数.那么当取完一个点$x$的 ...
- codevs 3981 动态最大子段和(线段树)
题目传送门:codevs 3981 动态最大子段和 题目描述 Description 题目还是简单一点好... 有n个数,a[1]到a[n]. 接下来q次查询,每次动态指定两个数l,r,求a[l]到a ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- 线段树--codevs 1690 开关灯
codevs 1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2& ...
- [Codevs] 1082 线段树练习3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...
- ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树
目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...
最新文章
- 【sublime Text】sublime Text3安装可以使xml格式化的插件
- 一个.Net Framework下的线程库
- [BJOI2015] 树的同构
- GreenDao高级用法
- 虚拟化容器Docker的安全性讨论
- api返回的数据结构_JavaScript中的数据结构数组 和 栈
- linux运行并行计算cuda,并行化计算与CUDA编程
- shell基础之EOF的用法
- 三款好用的前端代码编辑器推荐
- 简述多媒体计算机的特点,多媒体技术的主要特点
- 怎么用电脑屏幕录制功能录制游戏视频
- 为什么文本框里的字只显示一半_Word文本框文字显示不全、无法选择、不能编辑调整大小和跨页,怎么解决...
- 弹性网卡支持私网多IP
- Jenkins maven自动发布配置
- 企业抖音蓝v怎么认证?详谈蓝v申请认证流程
- linux系统密码正则,Linux密钥登录原理和ssh使用密钥实现免密码登陆
- jQuery入门与实战
- A Simple but Effective Pluggable Entity Lookup Table for Pre-trained Language Models翻译
- python函数返回多个变量_Python中接收函数多个返回结果的两种方法
- 洛谷P1719 最大加权矩形
热门文章
- [:zh]给机械课程设计的一封信[:] 2017-12-23
- Kernelized Correlation Filters (KCF) Tracking算法
- [OS复习]进程管理4
- C/C++ Development Library
- 由一个小库存软件想到的
- C语言头文件避免重复包含
- 一文读懂什么是C++移动语义《一》
- 【CyberSecurityLearning 76】DC系列之DC-7渗透测试(Drupal)
- 【CyberSecurityLearning 42】日志记录规则
- 实验四 [bx]和loop的使用+段前缀