首页 > 其他分享 >CF1270H Number of Components

CF1270H Number of Components

时间:2024-12-04 21:21:03浏览次数:4  
标签:连通 01 int 线段 Number CF1270H Components 序列 define

很好的题目。

首先容易发现连通块一定是一个区间,而这个时候就可以 \(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
*/ 

标签:连通,01,int,线段,Number,CF1270H,Components,序列,define
From: https://www.cnblogs.com/Cyan0826/p/18587226

相关文章

  • 来学习typescript 吧! --1基础类型(string、number、 boolean、void 、Null、undefined
    TS是JS的超集,所以js基础的类型都包含在内基础类型:Boolean、Number、String、null、undefined以及ES6的Symbol和ES10的BigInt一、安装和使用ts:1、npminstalltypescript-g//全局安装typescript2、tsc--init//生成tsconfig.json文件3、tscindex.ts//编译ts文......
  • [Javascript] Dealing with Number in Javascript
    Writebignumber//NOT100000//Better100_0001e5 Shorthandssyntaxforfloatingnumber//Normal0.123//Thesame.123//eXalsoapplytofloatingnumber3.14e10//31400000000console.log(0.123e10===.123e10)//true 8进制Startwith0⚠️ ......
  • 查看PCIe bridge设备的bus number
    PCIe设备的这三个busnumber是用于定义PCIe拓扑结构的重要参数。PrimaryBusNumber:桥设备上游总线号SecondaryBusNumber:桥设备直接连接的下游总线号SubordinateBusNumber:该桥下所有总线中最大的总线号在PCIe配置空间中的定义如下:structpci_bridge_config_space{......
  • [C++][CMake][Error] set_target_properties called with incorrect number of argume
    1简介这篇文章将探讨了在使用CMake构建C++项目时,调用set_target_properties函数时参数数量不正确所引发的问题。2错误案例以下为可能发生错误的案例include_directories(${CMAKE_SOURCE_DIR}/common)find_package(Threads)add_library(libusbmuxdSHAREDlibusbm......
  • [笔记]杜教筛 & Powerful Number 筛
    杜教筛杜教筛的作用杜教筛可以快速求出积性函数前缀和。如\(\varphi\),\(\mu\)等。什么是杜教筛定义\(f(x)\)为一个积性函数,求\(F(x)=\sum\limits_{i=1}^{n}f(x)\)。考虑构造函数\(h,g\),使得\(h=f*g\),即\(h(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d}......
  • MAT188 principal components
    MAT188:Homework5BackgroundBelowisanillustrationofthesouthwesternportionofthegreatprovinceofBritishColumbia.Citiesarelabelledinblue,andredcirclesindicatethelocationofpublicweathertations.Includedwiththisassignmentiste......
  • .NET9 EFcore支持早期MSSQL数据库 ROW_NUMBER()分页
    前言NET程序员是很幸福的,MS在上个月发布了NET9.0RTM,带来了不少的新特性,但是呢,我们是不是还有很多同学软硬件都还没更上,比如,自己的电脑还在跑Win7,公司服务器还在跑MSSQL2005-2008的!这不就引入了我们本文要探索的问题,因为MS早在EFcore3.1后就不再内置支持ROW_NUMBER()了,......
  • MySQL中的ROW_NUMBER窗口函数简单了解下
    ROW_NUMBER()是MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。这个顺序号是基于窗口函数的ORDERBY子句进行排序的,可以根据指定的排序顺序生成连续的整数值。ROW_NUMBER()在分页、去重、分组内排序等场景中非常有用。本文涉及到的脚本测试请......
  • 题解:UVA13185 DPA Numbers I
    UVA13185DPANumbersI基本思路对于每个\(n\),枚举\(n\)的因数,最后判断因数大小即可。直接枚举到\(n-1\)有点浪费,所以可以只枚举到\(\sqrt{n}\),加上因数与\(n\)除以此因数的商。注意:最后要减去\(n\),且\(n\)为完全平方数时要减去一个\(\sqrt{n}\)。代码实现#incl......
  • ASP.NET Core PDF viewers components Crack
    ASP.NETCorePDFviewerscomponentsCrackASP.NETCorePDFviewerscomponentswithformfillingsupportletusersdirectlycomplete,edit,andsubmitdatawithinPDFforms.TheabilitytoreadandwriteformfieldsinaPDFviewercomponenten......