CF1270H Number of Components

news/2024/12/26 18:17:17/文章来源:https://www.cnblogs.com/Cyan0826/p/18587226

很好的题目。

首先容易发现连通块一定是一个区间,而这个时候就可以 \(O(nlog^2 n)\) 解决了,具体就是用线段树维护,对于线段树上的节点维护其最左边的连通块的最大值,最右边的连通块的最小值,然后考虑 \(O(log n)\) 合并即可。

但还有更奇妙的做法,就是考虑每个连通块的断点 \(x\),一定是 \(\min_{i=1}^{x} a_i \ge \max_{i=x+1}^{n} a_i\),考虑这个后缀最大值的值为 \(w\),若将序列变成 $[a_i \ge w] $,那一定是一个形如 \(11111..100000\) 的序列,也就是说这个 \(01\) 序列只有两个连通块,所以对于相邻的两个数 \(a_i\)\(a_{i+1}\)\(w\) 在 $[\min(a_i,a_{i+1}),\max(a_i,a_{i+1})) $ 中才会出现一个 \(01\)

然后用一棵权值线段树维护 \(01\) 个数为 \(1\)\(w\) 的个数即可。

点击查看代码
#include<bits/stdc++.h>
#define fir first
#define sec second
#define int long long
#define pir pair<int,int>
#define mkp(a,b) make_pair(a,b)
using namespace std;
inline int read(){int x=0,f=1; char c=getchar();while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48); c=getchar();}return x*f;
}
const int mod=998244353,inf=1e9,N=5e5+5,V=1e6+5,lim=1e6;
int n,q,a[N];
struct tree{int mn[V<<2],res[V<<2],tg[V<<2];inline void push_up(int p){mn[p]=min(mn[p<<1],mn[p<<1|1]);res[p]=(mn[p<<1]==mn[p])*res[p<<1]+(mn[p<<1|1]==mn[p])*res[p<<1|1];}inline void modify(int p,int k){tg[p]+=k,mn[p]+=k;}inline void push_down(int p){if(tg[p]) modify(p<<1,tg[p]),modify(p<<1|1,tg[p]),tg[p]=0;}inline void upd(int l,int r,int p,int ll,int rr,int k){if(ll<=l&&r<=rr){modify(p,k);return ;}int mid=(l+r)>>1;push_down(p);if(ll<=mid) upd(l,mid,p<<1,ll,rr,k);if(rr>mid)  upd(mid+1,r,p<<1|1,ll,rr,k);push_up(p); }inline void add(int l,int r,int p,int num,int k){assert(l<=num&&num<=r);if(l==r){res[p]+=k; return ;}int mid=(l+r)>>1;push_down(p);if(num<=mid) add(l,mid,p<<1,num,k);else add(mid+1,r,p<<1|1,num,k);push_up(p);}
}T;
inline void change(int x,int k){T.upd(0,lim,1,min(a[x],a[x+1]),max(a[x],a[x+1])-1,k);}
signed main(){n=read(),q=read();a[0]=inf,a[n+1]=0;for(int i=1;i<=n;i++) a[i]=read(),T.add(0,lim,1,a[i],1);for(int i=0;i<=n;i++) change(i,1);while(q--){int x=read(),k=read();T.add(0,lim,1,a[x],-1),change(x-1,-1),change(x,-1);a[x]=k;T.add(0,lim,1,a[x],1),change(x-1,1),change(x,1);cout<<T.res[1]<<'\n'; }
}
/*
5 3
25 40 30 20 10
*/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846853.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ybt2.5章AC自动机题解

算法理解 即在字典树上跑kmp T1: 根据这个结论我自己手搓了一个AC自动机上去,喜提TLE 我是如何操作的呢? 我当时的想法是这样的:我们把字典树从根到该节点形成的链看成是一个模式串与文本串进行匹配,然后就用一个dfs来传递j就可以解决了 然后我打开书一看到这幅图,立马就不…

了解checksec显示的各种参数和保护

Arch:内核(32位/64位) RELRO 在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处. GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: rea…

20222325 2024-2025-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入…

【C++】关于 Visual Studio 的使用技巧(保姆级教程)

目录fliter 视图输出文件位置设置查看预处理结果将目标文件转换为可读的汇编自定义程序入口调试时查看变量在内存中的具体值查看代码的反汇编 fliter 视图 visual studio默认是filter视图(中文为筛选器)项目下的是filter而非硬盘目录里实际的文件夹,这时新建的也是filter想要…

Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案

问题背景 执行yum update出现如下报错排查虚拟机是否联网 ping -c 4 www.baidu.com 可以看到网络链接没有问题解决方案 原因是国外的镜像源有问题,换成国内的即可。 备份原有的镜像源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下…

D27 D26 kubernetes 通过Service实现蓝绿发布

1.蓝绿发布的基本原理蓝绿发布(Blue-Green-Deployment)是一种应用升级发布方式,这种方式可以瞬间切换到新版本,也可以瞬间回退到老版本。可以做到服务不中断的回滚,提升用户的使用体验。下面以在kubernetes中升级为例来说明蓝绿发布的过程为了在k8s中支持蓝绿发布,需要给应…

数字通信中不同信道类型对通信系统性能影响matlab仿真分析,对比AWGN,BEC,BSC以及多径信道

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)%, 4=AWGN+多径 3=BSC, 2=BEC, 1=AWGN% 计算误码for i0 = Lens + 2:-1:1 % 从后向前遍历比特if xor(msg(i0), ydec(i0)) == 1 &…

【投稿指南】你的论文正处于哪一阶段?SCI投稿状态详解

https://zhuanlan.zhihu.com/p/481416743 https://paper.dxy.cn/article/484873 https://zhuanlan.zhihu.com/p/446572754 https://zhuanlan.zhihu.com/p/378889611投稿过程中的常见缩写 EIC:Editors in Chief,期刊主编,掌握稿件最终决定权。 AE:Associate Editors,副编辑…

贪心策略(未完结)

每次都试图解决问题的尽量大的一部分 如兑换硬币,先以最多数量的最大面值来迅速减少找零面值首先确定基本结束条件(最直接的情况——其面值正好等于某种硬币) 减小问题的规模 递归算法:#!/user/bin/env python3 # -*- coding: utf-8 -*- def recMC(coinValueList, change):…

电感的通低频阻高频特性的测试

用手持电桥测出电感的实际值,以保证在这个频率附近电感数值不会有太大变化 10k档     40k档   100k档 9.96mH    9.77mH   17.25mH 用示波器的信号发生器产生一个200k的信号,串接以上电感,查看输出波形当信号为200k时输出波形的峰峰值为1.55V(不接电感时为2.44…