描述

两种操作:

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-反病毒软件-线段树相关推荐

  1. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  2. 2018.07.11 线段树基本模板复习

    白天听了一天的dpdp,晚上复习一下线段树的板子 //线段树维护区间增加(减少),区间最大值,区间最小值,区间和 #include<bits/stdc++.h>//宏命令替换常量和左右儿子 ...

  3. [九省联考2018]IIIDX 贪心 线段树

    ~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...

  4. 洛谷P4364 [九省联考2018]IIIDX(线段树)

    传送门 题解看得--很--迷? 因为取完一个数后,它的子树中只能取权值小于等于它的数.我们先把权值从大到小排序,然后记$a_i$为他左边(包括自己)所有取完他还能取的数的个数.那么当取完一个点$x$的 ...

  5. codevs 3981 动态最大子段和(线段树)

    题目传送门:codevs 3981 动态最大子段和 题目描述 Description 题目还是简单一点好... 有n个数,a[1]到a[n]. 接下来q次查询,每次动态指定两个数l,r,求a[l]到a ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. 线段树--codevs 1690 开关灯

    codevs 1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2& ...

  8. [Codevs] 1082 线段树练习3

    1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...

  9. ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树

    目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...

最新文章

  1. 【sublime Text】sublime Text3安装可以使xml格式化的插件
  2. 一个.Net Framework下的线程库
  3. [BJOI2015] 树的同构
  4. GreenDao高级用法
  5. 虚拟化容器Docker的安全性讨论
  6. api返回的数据结构_JavaScript中的数据结构数组 和 栈
  7. linux运行并行计算cuda,并行化计算与CUDA编程
  8. shell基础之EOF的用法
  9. 三款好用的前端代码编辑器推荐
  10. 简述多媒体计算机的特点,多媒体技术的主要特点
  11. 怎么用电脑屏幕录制功能录制游戏视频
  12. 为什么文本框里的字只显示一半_Word文本框文字显示不全、无法选择、不能编辑调整大小和跨页,怎么解决...
  13. 弹性网卡支持私网多IP
  14. Jenkins maven自动发布配置
  15. 企业抖音蓝v怎么认证?详谈蓝v申请认证流程
  16. linux系统密码正则,Linux密钥登录原理和ssh使用密钥实现免密码登陆
  17. jQuery入门与实战
  18. A Simple but Effective Pluggable Entity Lookup Table for Pre-trained Language Models翻译
  19. python函数返回多个变量_Python中接收函数多个返回结果的两种方法
  20. 洛谷P1719 最大加权矩形

热门文章

  1. [:zh]给机械课程设计的一封信[:] 2017-12-23
  2. Kernelized Correlation Filters (KCF) Tracking算法
  3. [OS复习]进程管理4
  4. C/C++ Development Library
  5. 由一个小库存软件想到的
  6. C语言头文件避免重复包含
  7. 一文读懂什么是C++移动语义《一》
  8. 【CyberSecurityLearning 76】DC系列之DC-7渗透测试(Drupal)
  9. 【CyberSecurityLearning 42】日志记录规则
  10. 实验四 [bx]和loop的使用+段前缀