CF1567E Non-Decreasing Dilemma
题目大意
给出nnn个数,有mmm个操作
111 xxx www :将xxx位置上的数改为www
222 lll rrr :查询区间[l,r][l,r][l,r]内有多少个连续的不下降区间(单个数也算)
思路
我们需要维护的是区间内符合条件的个数,初步考虑的话似乎是有区间相加的性质的,如果考虑两个区间相互独立,不会对各自的递增性质产生影响。
这时我们想到线段树的pushuppushuppushup操作。
在两个区间合并成一个大区间的,有可能中间的部分会产生连续的递增区间,这个时候合并的时候需要维护一个中点向左边和右边拓展的最大长度,然后判断两个端点是否能进行合并。(详细看代码)
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
const int maxn = 2e5 + 9;
int a[maxn], b[maxn];
struct num_node
{int l, r;int lm, rm;
// lm从左边这个数字开始往右最长不下降序列长度(往右端最长延伸)
// rm从右边这个数字开始往左最长不上升序列长度(往左端最长延伸)ll sum; //表示[l,r]区间内有多少个连续递增区间
} s[maxn << 2];
int n, m;
void pushup(int k)
{s[k].sum = s[k << 1].sum + s[k << 1 | 1].sum;s[k].lm = s[k << 1].lm, s[k].rm = s[k << 1 | 1].rm;if (a[s[k << 1].r] <= a[s[k << 1 | 1].l])//可以合并{if (s[k << 1].lm == s[k << 1].r - s[k << 1].l + 1)s[k].lm += s[k << 1 | 1].lm;if (s[k << 1 | 1].rm == s[k << 1 | 1].r - s[k << 1 | 1].l + 1)s[k].rm += s[k << 1].rm;s[k].sum += 1ll * s[k << 1].rm * s[k << 1 | 1].lm;}
}
void build(int k, int l, int r)
{s[k].l = l;s[k].r = r;if (l == r){s[k].sum = 1;s[k].lm = s[k].rm = 1;return;}int mid = (l + r) >> 1;build(k << 1, l, mid);build(k << 1 | 1, mid + 1, r);pushup(k);
}
void update(int k, int x, int w)
{int l = s[k].l, r = s[k].r;if (l == r){a[x] = w;return;}int mid = (l + r) >> 1;if (mid >= x)update(k << 1, x, w);if (mid < x)update(k << 1 | 1, x, w);pushup(k);
}
ll query(int k, int L, int R)
{int l = s[k].l, r = s[k].r;if (l > R || r < L)return 0;if (L <= l && r <= R)return s[k].sum;pushup(k);int mid = (l + r) >> 1;ll ans = 0;if (mid >= L)ans += query(k << 1, L, R);if (mid < R)ans += query(k << 1 | 1, L, R);if (a[s[k << 1].r] <= a[s[k << 1 | 1].l]){int lsum = min(mid - L + 1, s[k << 1].rm), rsum = min(R - (mid + 1) + 1, s[k << 1 | 1].lm);if (lsum > 0 && rsum > 0)//注意要大于0ans += 1ll * lsum * rsum;}return ans;
}
int L[maxn], R[maxn];
int main()
{int n, m;scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i)scanf("%d", &a[i]);build(1, 1, n);while (m--){int wx;scanf("%d", &wx);if (wx == 1){int x, w;scanf("%d %d", &x, &w);update(1, x, w);}else{int L, R;scanf("%d %d", &L, &R);printf("%lld\n", query(1, L, R));}}return 0;
}
CF1567E Non-Decreasing Dilemma相关推荐
- Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : ‘x‘ must be atomic
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 'x' must be atomic 目录 Err ...
- BNUOJ 52325 Increasing or Decreasing 数位dp
题目链接: https://acm.bnu.edu.cn/v3/contest_show.php?cid=8506#problem/I I. Increasing or Decreasing Case ...
- 【时空序列预测第四篇】PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive
前言 保持住节奏,每周起码一篇paper reading,要时刻了解研究的前沿,是一个不管是工程岗位还是研究岗位AIer必备的工作,共勉! 准备再写几篇这种非常细致的文章之后,接下来写作主要集中在模型 ...
- PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive Learning 翻译
PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive Learning 目录 ...
- codeforces 1567 E. Non-Decreasing Dilemma
本场比赛其他题目的题解 A. Domino Disaster B. MEXor Mixup C. Carrying Conundrum D. Expression Evaluation Error E ...
- CUIT ACM Personal Training 11.27(FM) H - Slightly Decreasing Permutations
H - Slightly Decreasing Permutations Time Limit:2000MS Memory Limit:262144KB 64bit IO Format ...
- 囚徒困境 matlab,matlab 囚徒困境(prisoner's dilemma)是指两个被捕 联合开发网 - pudn.com...
matlab 所属分类:仿真建模 开发工具:matlab 文件大小:3KB 下载次数:7 上传日期:2019-04-11 16:26:35 上 传 者:Sonny_song 说明: 囚徒困境(pri ...
- Leetcode 1370. Increasing Decreasing String
Leetcode 1370. Increasing Decreasing String 题目链接: Increasing Decreasing String 难度:easy 题目大意: 按照题目要求对 ...
- LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)
LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...
最新文章
- Data Lake Analytics: 读/写PolarDB的数据
- CSP-S集训刷题记录
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
- 关键业务开放平台助金融行业数字化转型
- [Alpha]Scrum Meeting#4
- typeof的用法 typeof的返回值是一个字符串 返回的字符串类别
- TensorFlow 可用的数据增强
- Oracle 根据业务创建新的用户
- oracle连接no listener
- Cent os 7 使用vnc远程访问
- mysql 格林时间转换_oracle中将格林威治时间转化为一般时间
- LaTeX 使用 \begin{aligned} 出现错误代码 Environment aligned undefined. \begin{aligned}
- java电话号码_java编程——电话号码查询系统
- JavaSE自学笔记013_Real(抽象类、接口、两种设计模式)
- 项目中,你们如何进行需求评审?
- WPS文字给字体添加纹理效果快速改变输入文字的颜色
- 江苏计算机设计大赛2018,附件12018年江苏省大学生计算机设计大赛校级选拔赛大赛内.doc...
- 混合开发之仿微信朋友圈
- 网曝鸿蒙OS切换英文变安卓?客服回应太尴尬……
- 打开.jmx文件时报错:CannotResolveClassException
热门文章
- 武魂显示无法连接服务器,武魂天下进不去连接服务器失败解决方法
- 馋猫美食记录本_隐私政策
- AFX_VIRTUAL
- [UML]建模是什么?为什么要建模?
- 文档习惯之格式篇 用文档逼疯一个人的五种办法
- android 取消蓝牙配对框 实现自动配对,Android 取消蓝牙配对框实现自动配对功能...
- 回答完数据库连接池原理,面试官跪着求我入职他们公司
- 昨天在洛阳,也就是阴历十月一日,晚上有在自家门前烧纸的,有点好奇,今天知道了
- Python爬虫的多线程使用方法
- vscode/typora+picGo-core(命令行CLI)/picGo(GUI)+图片上传(github/smms)/批量上传/typora语法扩展渲染功能设置/修改本地图片存放位置配置