CF1270H Number of Components(线段树)

problem

洛谷链接

solution

定理i<ji<ji<ji,ji,ji,j 联通,则必有 k∈(i,j)k\in(i,j)k(i,j) 也与 i,ji,ji,j 联通。

下面给出证明,挺显然的。

  • ai<aja_i<a_jai<aj,则一定有 ai<ak∨ak<aja_i<a_k\vee a_k<a_jai<akak<aj 成立。
  • ai>aja_i>a_jai>aj,则一定有一个 x<ix<ix<i 满足 ax<ai∧ax<aja_x<a_i\wedge a_x<a_jax<aiax<aj 使得 i,ji,ji,j 间接联通。
    • ak<axa_k<a_xak<ax,则有 k−jk-jkj 联通。
    • ax<aka_x<a_kax<ak,则有 k−xk-xkx 联通。

所以一个连通块一定对应的是数组 aaa 的一段连续区间。

也就是说,所有连通块将数组划分成若干个互不相交且并集为整个数组的区间。

考虑相邻两个连通块,假设前一个联通块的左右端点为 l1,r1l_1,r_1l1,r1,则后一个联通块的左右端点为 r1+1(l2),r2r_1+1(l_2),r_2r1+1(l2),r2

当且仅当 min⁡{ai∣i∈[l1,r1]}>max⁡{ai∣i∈[l2,r2]}\min\{a_i|i\in [l_1,r_1]\}>\max\{a_i|i\in[l_2,r_2]\}min{aii[l1,r1]}>max{aii[l2,r2]} 两个联通块才不会合并。

进一步讲,点 kkk 能够成为一个连通块的分断点,当且仅当 min⁡{ai∣i≤k}>max⁡{ai∣k<i}\min\{a_i|i\le k\}>\max\{a_i|k<i\}min{aiik}>max{aik<i}

不妨将 ai≥aka_i\ge a_kaiak 的位置设为 111ai<aka_i<a_kai<ak 的设为 000,将这个新数组表示为 f(k)f(k)f(k),与 kkk 有关。

则发现,当 kkk 为分断点的时候,f(k)f(k)f(k) 的长相一定是 111...11⏟k000...00\underbrace{111...11}_{k}000...00k111...11000...00

换言之,当 kkk 为分断点的时候,f(k)f(k)f(k)ai≠ai+1a_i\neq a_{i+1}ai=ai+1iii 有且仅有一个。

当然 f(k)f(k)f(k) 的长相有很多种。但如果 kkk 成为分断点那么 f(k)f(k)f(k) 就只能有一种长相。

换个角度讲,令 w=max⁡{ai∣k<i}w=\max\{a_i|k<i\}w=max{aik<i},将 >w>w>w 的位置设为 111≤w\le ww 的设为 000,将新数组依旧表示为 f(w)f(w)f(w)

f(w)f(w)f(w) 的长相一定也是 111...11⏟k000...00\underbrace{111...11}_{k}000...00k111...11000...00

确定一个满足条件的 www 后的 kkk 也是唯一的。所以没必要枚举断点 kkk,只需要枚举 www 即可。

也就是说,只需要统计有多少个 www 对应的 f(w)f(w)f(w) 长相是这样的,即有且仅有一对相邻的 101010

为了规避全 000 和全 111,也就是 w=min⁡/max⁡{ai∣i∈[1,n]}w=\min/\max\{a_i|i\in[1,n]\}w=min/max{aii[1,n]} 的情况,这个时候是没有一对 101010 的。

不妨令 a0=∞,an+1=0a_0=∞,a_{n+1}=0a0=,an+1=0。则满足条件的 wwwf(w)f(w)f(w) 有且仅有一对相邻的 101010

以权值 www 为下标建立线段树,记录每个叶子对应 f(x)f(x)f(x) 长相中 101010 的对数。

最后统计多少个位置的对数为 111 即可。

考虑修改 aia_iai ,会对 w∈[min⁡{ai−1,ai},max⁡{ai−1,ai})⋃[min⁡{ai,ai+1},max⁡{ai,ai+1})w\in\Big[\min\{a_{i-1},a_i\},\max\{a_{i-1},a_{i}\}\Big)\bigcup\Big[\min\{a_{i},a_{i+1}\},\max\{a_{i},a_{i+1}\}\Big)w[min{ai1,ai},max{ai1,ai})[min{ai,ai+1},max{ai,ai+1}) 造成贡献变化。

例如 w∈[min⁡{ai−1,ai},max⁡{ai−1,ai})w\in\Big[\min\{a_{i-1},a_i\},\max\{a_{i-1},a_{i}\}\Big)w[min{ai1,ai},max{ai1,ai})ai−1,aia_{i-1},a_iai1,ai 会构成一对 010101,在线段树上将这个区间整体 +1+1+1 即可。

注意到 ai−1,ai+1a_{i-1},a_{i+1}ai1,ai+1 可能越界,不妨设 a0=lim⁡,an+1=0a_0=\lim,a_{n+1}=0a0=lim,an+1=0,那么不管 iii 位置,所有 www 至少都会有 111010101

线段树很难做到快速查询哪些位置是 111。但是现在所有的 www010101 个数 ≥1\ge 11

就可以用线段树统计最小值和个数了。当且仅当最小值为 111 的时候再记录答案即可。

当然要注意,只有当前出现在 aaa 数组里的 www,即 w=aiw=a_iw=ai,才能在线段树中统计代表 www 的叶子节点是否贡献。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 500005
#define lim 1000001
int n, q;
int a[maxn];
struct node { int sum, tag, cnt; }t[lim + 5 << 2];#define lson now << 1
#define rson now << 1 | 1
#define mid (l + r >> 1)void pushup( int now ) {if( t[lson].sum < t[rson].sum ) t[now].sum = t[lson].sum, t[now].cnt = t[lson].cnt;else if( t[lson].sum > t[rson].sum ) t[now].sum = t[rson].sum, t[now].cnt = t[rson].cnt;elset[now].sum = t[lson].sum, t[now].cnt = t[lson].cnt + t[rson].cnt;
}void pushdown( int now ) {if( t[now].tag ) {t[lson].sum += t[now].tag;t[rson].sum += t[now].tag;t[lson].tag += t[now].tag;t[rson].tag += t[now].tag;t[now].tag = 0;}
}void modify( int now, int l, int r, int L, int R, int x ) {if( R < l or r < L ) return;if( L <= l and r <= R ) {t[now].sum += x;t[now].tag += x;return;}pushdown( now );modify( lson, l, mid, L, R, x );modify( rson, mid + 1, r, L, R, x );pushup( now );
}void modify( int now, int l, int r, int pos, int x ) {if( l == r ) { t[now].cnt += x; return; }pushdown( now );if( pos <= mid ) modify( lson, l, mid, pos, x );else modify( rson, mid + 1, r, pos, x );pushup( now );
}int query( int now, int l, int r, int L, int R ) {if( R < l or r < L ) return 0;if( L <= l and r <= R ) return t[now].sum == 1 ? t[now].cnt : 0;pushdown( now );return query( lson, l, mid, L, R ) + query( rson, mid + 1, r, L, R );
}void modify( int l, int r, int x ) {if( l == r ) return;if( l > r ) swap( l, r );modify( 1, 0, lim, l, r - 1, x );
}int main() {scanf( "%d %d", &n, &q );for( int i = 1;i <= n;i ++ ) scanf( "%d", &a[i] );a[0] = lim;for( int i = 0;i <= n;i ++ ) {modify( a[i], a[i + 1], 1 );modify( 1, 0, lim, a[i], 1 );}while( q -- ) {int pos, x;scanf( "%d %d", &pos, &x );modify( a[pos - 1], a[pos], -1 );modify( a[pos], a[pos + 1], -1 );modify( 1, 0, lim, a[pos], -1 );a[pos] = x;modify( a[pos - 1], a[pos], 1 );modify( a[pos], a[pos + 1], 1 );modify( 1, 0, lim, a[pos], 1 );printf( "%d\n", query( 1, 0, lim, 1, lim - 1 ) );}return 0;
}

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

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

相关文章

tex模板

\documentclass{beamer} \usetheme{Madrid} \usecolortheme{default} \usepackage{ctex} \usefonttheme[math]{serif}\usepackage{graphicx} \graphicspath{{img/},{pics/}} % 图片在img目录\title{} \author{} \institute{} \date{\today} \begin{document}\maketitle\begin{f…

Wexflow:C#中的开源工作流引擎

Wexflow是一个高性能、可扩展、模块化和跨平台的工作流引擎。Wexflow在GitHub&#xff1a;https://github.com/aelassas/Wexflow。Wexflow的目标是在没有用户干预的情况下自动执行重复任务。在Wexflow的帮助下&#xff0c;构建自动化和工作流过程变得简单。Wexflow还有助于使长…

分析数学笔记

文章目录夹逼收敛定理(P45):单调收敛定理(P50):闭区间套定理(P56)&#xff1a;有限覆盖定理(P59)&#xff1a;可数集(P62)&#xff1a;聚点(P62)&#xff1a;聚点原理(P62)&#xff1a;波尔查诺-魏尔斯特拉斯定理(P64)柯西序列&柯西收敛准则(P65)压缩映照原理(P67)上下极限…

ASP.NET Core 沉思录 - Logging 的两种介入方法

ASP.NET Core 中依赖注入是一个很重要的环节。因为几乎所有的对象都是由它创建的&#xff08;相关文章请参见《ASP.NET Core 沉思录 - ServiceProvider 的二度出生》&#xff09;。因此整个日志记录的相关类型也被直接添加到了 IServiceCollection 中。今天我们将介绍各个接口/…

CF936D World of Tank(思维dp)

problem 洛谷链接 solution 有一种 dpdpdp 并不常见。其主要思想大概就是积累后再支出 / 先预支后再填充。 本题就是积累后再支出。显然炮冷却好了后就一直处于可用状态&#xff0c;玩没玩过游戏的都知道一冷却好就打一定不会劣于等一会再打&#xff0c;因为这道题的炮也没…

C# 中的Async 和 Await 的用法详解

众所周知C#提供Async和Await关键字来实现异步编程。在本文中&#xff0c;我们将共同探讨并介绍什么是Async 和 Await&#xff0c;以及如何在C#中使用Async 和 Await。同样本文的内容也大多是翻译的&#xff0c;只不过加上了自己的理解进行了相关知识点的补充&#xff0c;如果你…

AtCoder4515 [AGC030F] Permutation and Minimum(dp)

problem 洛谷链接 solution 一个 AiA_iAi​ 只会影响一个 BiB_iBi​&#xff0c;BiB_iBi​ 之间的决定因素 AAA 是不会有交的。 所以如果相邻两个对同一个 BiB_iBi​ 影响的 A2i,A2i−1A_{2i},A_{2i-1}A2i​,A2i−1​ 都是确定的&#xff0c;那么 BiB_iBi​ 也就确定了。 …

Tree Xor(未完全搞定)

Tree Xor 题意&#xff1a; 一颗有n个点的树&#xff0c;边权给出&#xff0c;第i个节点的权值为Wi&#xff0c;但并不知道Wi&#xff0c;只知道Wi在[Li,Ri]&#xff0c;边权等于两端点的异或值 问W序列有多少可能 题解&#xff1a; 如果我们知道一个点的值&#xff0c;就可…

Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务

本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构&#xff0c;部署的微服务主要包括统一网关&#xff08;使用Ocelot开发&#xff09;、统一认证&#xff08;IdentityServer4&#xff09;、应用服务&#xff08;asp.net core web api&#xff09;&#xff1b;本文不…

AtCoder3950 [AGC022E] Median Replace(DFA + dp)

problem solution 可以从 DFA\text{DFA}DFA 的思想来考虑这道题。 考虑建一个 DFA\text{DFA}DFA 只接受最后可以变成字符串 111 的原串。 因为每次是选择三个 连续/相邻 的位置操作&#xff0c;限制是比较强的&#xff0c;无非有三种情况。 case1 三个全 111&#xff0c;操…

Minimum grid

Minimum grid 题意&#xff1a; 一个n * n的矩阵&#xff0c;有m个位置需要填数&#xff0c;填的数的范围是0<k<1e6,需要满足第i行的最大值是b&#xff0c;第j列的最大值是ci&#xff0c;求一个满足条件的最小代价 n<2e3,m<8e5,k<1e6 题解&#xff1a; 如果…

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

一、前言在之前的文章&#xff08;ASP.NET Core 实战&#xff1a;Linux 小白的 .NET Core 部署之路&#xff09;中&#xff0c;我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core Runtime、Nginx、MySQL&#xff0c;以及如何将我们的 ASP.NET Core MVC 程序部署到 Li…

AtCoder 4169 [ARC100D] Colorful Sequences(dp)

problem 洛谷链接 solution 逆向考虑。ansansans 所有蛋糕中的 aaa 序列出现次数 −-− 在 non−colorfulnon-colorfulnon−colorful 蛋糕中的出现次数。 在所有蛋糕中的出现次数&#xff0c;即 (n−m1)⋅kn−m(n-m1)k^{n-m}(n−m1)⋅kn−m&#xff0c;枚举 aaa 序列开头的…

VS2017 无法连接到Web服务器“IIS Express”终极解决方案

今天日了gou了&#xff0c;一大早打开VS2017的时候出现无法连接到Web服务器“IIS Express”的错误&#xff0c;然后必应了一下&#xff0c;再谷歌了一下找到的解决方法也都千篇一律&#xff0c;奈何都没能解决&#xff0c;最后通过静下心来的思考&#xff0c;尝试解决了问题&am…

CodeForces 1361E James and the Chase(dfs + 结论)

problem 洛谷链接 solution 看到这个 20%20\%20% 的特殊性质&#xff0c;脑海里第一个就想到了随机化算法。已经PTSD了着实上头 如果本题只是随便求一个 interesting\text{interesting}interesting 的点&#xff0c;那就非常简单了。 随机化一个点&#xff0c;检查这个点是…

2021牛客暑期多校训练营4

2021牛客暑期多校训练营4 题号题目知识点ACourseBSample GameCLCSDRebuild TreeETree Xor思维线段树FJust a jokeGProductHConvolutionIInverse PairJAverage

Docker最全教程之使用.NET Core推送钉钉消息(二十)

前言上一篇我们通过实战分享了使用Go推送钉钉消息&#xff0c;由于技痒&#xff0c;笔者现在也编写了一个.NET Core的Demo&#xff0c;作为简单的对照和说明。最后&#xff0c;由于精力有限&#xff0c;笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块…

[线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r_{m-1}\}{r0​,r1​,...,rm−1​} 。 若对于任意 m−1≤nm-1\le nm−1≤n &#xff0c;有 ∑i0m−1an−iri0\sum_{i0}^{m-1}a_{n-i}r_i0∑…

Average

Average 题意&#xff1a; 矩阵W的值可以通过数组a和b得到&#xff0c;W[i][j]a[i]b[j],现在求W的一个子矩阵&#xff0c;平均值最大&#xff0c;且子矩阵必须满足宽度至少是x&#xff0c;高度至少是y&#xff0c;计算最大平均值 题解&#xff1a; 那答案就变成了分别对a和b…

开箱即用Bumblebee独立部署搭建webapi网关详解

在之前的章节里都是讲述如何在程序中使用Bumblebee来构建一个Webapi网关&#xff1b;但这样显然有些麻烦&#xff0c;毕竟很多时候可能只需要一个简单负载处理&#xff0c;还需要写个程序针对服务进行编写代码或配置的确是比较麻烦的事情&#xff1b;如果有负载方面的调整还需要…