题目大意

动态维护数列中大于等于某个数的极长连续段的个数。

思路

我们考虑每段的开头,记为 \(i\),高度为 \(a_i\)

那么此时水淹的高度必然满足 \(a_{i-1} < x \leq a_i\)

这样的 \(x\) 在此处会给答案贡献加一

那么我们考虑所有的这种位置,开一棵权值线段树,对于这些 \(x\) 的位置都加 \(1\)

询问时就单点查询 \(x\) 在线段树种的值就行了

修改时注意它原来的贡献,包括它与前面的数和它与后面的数

这些减去,修改后在加上新的贡献

然后,就没有然后了······

\(Code\)

#include<cstdio>
#define ls (k << 1)
#define rs (ls | 1)
using namespace std; const int N = 5e5;
int n , m , a[N + 5] , last;
struct seg{
int sum , tag;
}t[4 * N + 5]; void pushdown(int k , int l , int r)
{
if (!t[k].tag) return;
int m = (l + r) >> 1;
t[ls].sum += (m - l + 1) * t[k].tag , t[ls].tag += t[k].tag;
t[rs].sum += (r - m) * t[k].tag , t[rs].tag += t[k].tag;
t[k].tag = 0;
} void pushup(int k){t[k].sum = t[ls].sum + t[rs].sum;} void update(int l , int r , int k , int x , int y , int v)
{
if (x <= l && r <= y)
{
t[k].sum += (r - l + 1) * v;
t[k].tag += v;
return;
}
pushdown(k , l , r);
int mid = (l + r) >> 1;
if (x <= mid) update(l , mid , ls , x , y , v);
if (y > mid) update(mid + 1 , r , rs , x , y , v);
pushup(k);
} int query(int l , int r , int k , int x)
{
if (l == r && l == x) return t[k].sum;
pushdown(k , l , r);
int mid = (l + r) >> 1;
if (x <= mid) return query(l , mid , ls , x);
else return query(mid + 1 , r , rs , x);
} int main()
{
freopen("patrick.in" , "r" , stdin);
freopen("patrick.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
for(register int i = 1; i <= n; i++)
{
scanf("%d" , a + i);
if (a[i] > N) a[i] = N;
if (a[i] > a[i - 1]) update(1 , N , 1 , a[i - 1] + 1 , a[i] , 1);
}
char opt[5]; int x , y;
for(register int i = 1; i <= m; i++)
{
scanf("%s" , opt);
if (opt[0] == 'Q')
{
scanf("%d" , &x) , x ^= last;
last = query(1 , N , 1 , x);
printf("%d\n" , last);
}
else {
scanf("%d%d" , &x , &y) , x ^= last , y ^= last;
if (a[x] > a[x - 1]) update(1 , N , 1 , a[x - 1] + 1 , a[x] , -1);
if (a[x + 1] > a[x]) update(1 , N , 1 , a[x] + 1 , a[x + 1] , -1);
a[x] = y;
if (a[x] > a[x - 1]) update(1 , N , 1 , a[x - 1] + 1 , a[x] , 1);
if (a[x + 1] > a[x]) update(1 , N , 1 , a[x] + 1 , a[x + 1] , 1);
}
}
}

JZOJ 6801. NOIP2020.9.19模拟patrick的更多相关文章

  1. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

  2. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  3. 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)

    Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: ...

  4. JZOJ 3453.【NOIP2013中秋节模拟】连通块(connect)

    3453.[NOIP2013中秋节模拟]连通块(connect) Time Limits: 1000 ms Memory Limits: 262144 KB (File IO): input:conn ...

  5. [JZOJ 5852] [NOIP2018提高组模拟9.6] 相交 解题报告 (倍增+LCA)

    题目链接: http://172.16.0.132/senior/#main/show/5852 题目: 题目大意: 多组询问,每次询问树上两条链是否相交 题解: 两条链相交并且仅当某一条链的两个端点 ...

  6. [JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)

    题目链接: http://172.16.0.132/senior/#main/show/5875 题目: 题解: 注意这题只能经过开放的港口 我们考虑用vector存下每个点不能到的点,并把并让vec ...

  7. 【JZOJ 5048】【GDOI2017模拟一试4.11】IQ测试

    题目大意: 判断一个序列是否是另外一个序列删除若干个数字之后得到的. 正文: 我们可以定义两个指针,分别指向长序列和短序列. 拿样例来举例: 如果指针指的数相同,两个指针都往右跳: 如果不同,则指向长 ...

  8. linux 系统管理 使用技巧

    一.这篇文章讲了什么? 这篇文章很有参考性哈.本来是想等一段时间有更多条技巧后在发布的,不过,突然发现,我是去年的今天在博客园落户了,祝我的博客一周岁快乐,希望以后多分享一些文章啦.所以就把草稿箱的其 ...

  9. NET4.5之初识async与await

    这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问 ...

  10. ...python の 学习

    5.14 ...上次学python 好像是一个月前.. 写点东西记录下叭.. 现在在看李老大写的博客写..可能直接开抄代码... 感觉自己写的总是爬不成功,之前写的爬豆瓣影评的爬虫还是残的... 1. ...

随机推荐

  1. 关于vlc"编解码器暂不支持: VLC 无法解码格式“MIDI” (MIDI Audio)"解决

    解决办法 sudo apt install vlc-plugin-fluidsynth

  2. 关于CSDN发布博客接口的研究

    前言 其实我之前就有一个想法,实现用 python 代码来发布博客, 因为我个人做了一个发布到 github 博客软件(其实就是实现 git 命令集成,还有markdown的渲染的软件), 如果我弄明 ...

  3. 更换linux的开机启动图片, 启动主题

    简述 之前就想更改开机的启动图片,但是后来简单查了一下,说要重新编译内核,听到编译我就望而却步了,今天发现只是个命令而已,注意这里我用的是 linux mint .这里更改不是 grub 主题, 是 ...

  4. Spring Security(6)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- Spring Security使用MySQL保存cookie记录虽然方便,但是目前更多的主流互联网应用都是用NoSQL来保存非业务数据的,Spr ...

  5. tostring、(string)和 String.valueOf()

    上周遇到一个问题,只怪自己平时没注意这个细节,从数据库取数据在map集合里,取出该值是我用了.tostring的方法,一次在当取出数据为空时代码报java.lang.NullPointerExcept ...

  6. python文件名解析---从文件名获得分类类别

    python文件名解析-从文件名获得分类类别 python os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.列表以字母顺序. listdir()方法 举例说明 lis ...

  7. 论文解读丨【CVPR 2022】不使用人工标注提升文字识别器性能

    摘要:本文提出了一种针对文字识别的半监督方法.区别于常见的半监督方法,本文的针对文字识别这类序列识别问题做出了特定的设计. 本文分享自华为云社区<[CVPR 2022] 不使用人工标注提升文字识 ...

  8. Jmeter 之在linux中监控Memory、CPU、I/O资源等操作方法

    在做性能测试时,单纯的只看响应时间.错误率.中间值远远不够的,有时需要监控服务cpu.内存等指标来判断影响性能的瓶颈在哪. 操作步骤: 一.Linux下配置jmeter环境 1.在linux环境下安装 ...

  9. MongoDB 索引原理与索引优化

    转载请注明出处: 1.MongoDB索引 索引通常能够极大的提高查询的效率, 如果没有索引, MongoDB 在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率 ...

  10. Python实验报告(第10章)

    实验10:文件及目录操作 一.实验目的和要求 1.掌握基本文件操作(创建.打开.关闭.写入): 2.掌握目录操作的基本操作(创建.删除.遍历): 3.了解高级文件操作(删除文件.获取文件基本信息). ...