题目大意

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

思路

我们考虑每段的开头,记为 \(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. 关于在linux上vm virtualbox读取不到U盘问题的解决

    1.设置usb2.0模式 如果你没安装拓展插件的话,调成usb2.0就会出现无效的配置这个提示,并且启动虚拟机会报 Implementation of the USB 2.0 controller n ...

  2. 微信小程序实战,基于vue2实现瀑布流

    1.什么是瀑布流呢? 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 瀑布流对于图片的展现, ...

  3. 零基础入门数据挖掘——二手车交易价格预测:baseline

    零基础入门数据挖掘 - 二手车交易价格预测 赛题理解 比赛要求参赛选手根据给定的数据集,建立模型,二手汽车的交易价格. 赛题以预测二手车的交易价格为任务,数据集报名后可见并可下载,该数据来自某交易平台 ...

  4. bug处理记录:java.util.UnknownFormatConversionException: Conversion = 'Y'

    1. 报错: java.util.UnknownFormatConversionException: Conversion = 'Y' at java.util.Formatter$FormatSpe ...

  5. kernel 启动流程

    一.概述 之前学习了uboot的启动流程,现在接着学习uboot的启动流程,关于 kernel 的启动流程分析的大佬也是很多的,这里还是通过流程的图的方式进行记录,为了像我一样的新手,直观的了解 ke ...

  6. Qt多线程开发总览,既然用到了就记录一下

    多线程 在LBD_VM_Intercom中使用的一个简单的实例 陶工给的dll需要进行异步操作才可以将视频画面附到窗体上,必须得在画面出现之后才可以附加画面,否则就有可能出现意外bug,所以需要在这个 ...

  7. uniapp input框聚焦时软键盘弹起整个页面上滑,固定页面不让上滑问题

    根据需求,软键盘弹起时,不允许页面整体向上滑动 用到的属性是:  :adjust-position="false" uni-app 软键盘顶起底部fixed定位的输入框 页面就不会 ...

  8. 从Spring中学到的【2】--容器类

    容器类 我们在实际编码中,常常会遇到各种容器类,他们有时叫做POJO,有时又叫做DTO,VO, DO等,这些类只具有容器的作用,具有完全的get,set方法,作为信息载体,作数据传输用. 其实,很多地 ...

  9. [OpenCV实战]28 基于OpenCV的GUI库cvui

    目录 1 cvui的使用 1.1 如何在您的应用程序中添加cvui 1.2 基本的"hello world"应用程序 2 更高级的应用 3 代码 4 参考 有很多很棒的GUI库,例 ...

  10. 企业应用架构研究系列二十五:IdentityServer4 认证服务搭建

    IdentityServer4 更新了开源协议,曾经想替换它,不在使用IdentityServer4 ,但是后来,研究来研究去,发现IdentityServer4 的功能实在是强大,设计体系完整,随着 ...