题目大意

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

思路

我们考虑每段的开头,记为 \(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. python安装第三方库换源

    永久修改 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple 其他 这个都属于pip 命令行,config 后 ...

  2. 【SQL进阶】【表默认值、自增、修改表列名、列顺序】Day02:表与索引操作

    一.表的创建.修改与删除 1.创建一张新表 [设置日期默认值.设置id自增] [注意有备注添加备注COMMENT] CREATE TABLE user_info_vip( id int(11) pri ...

  3. 【每日一题】【优先队列、迭代器、lambda表达式】2022年1月15日-NC119 最小的K个数

    描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数.例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可). 数据范围: ...

  4. 3D旋转不能对齐,元素边倾斜

    1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...

  5. 论文解读(PCL)《Probabilistic Contrastive Learning for Domain Adaptation》

    论文信息 论文标题:Probabilistic Contrastive Learning for Domain Adaptation论文作者:Junjie Li, Yixin Zhang, Zilei ...

  6. .NET技术与企业级解决方案研究应用

    分布式缓存框架 Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的KV ...

  7. Qt从实习到搬砖

    Qt C++ 工具箱 从零开始的Qt开发之路 里面大概会写一些和Qt相关的内容,也不说是从0开始,感觉Qt做东西和用 C#也差不了很多?也许吧,总之慢慢来,一步一个脚印,直到给它拿下. 2022.5. ...

  8. 【JVM】经典垃圾回收器

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 转载请在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益.让我们一起维护 ...

  9. python 之异常捕获及处理(try--except)

    在python中,至少有两类错误,一种是程序语法错误,一种是程序异常. 所谓的语法错误是指你未按规定格式书写导致的错误,如:定义函数时,括号后面要紧跟英文冒号,若缺失则不能识别与运行,并抛出 Synt ...

  10. 重学c#系列—— 反射深入一点点[三十三]

    前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...