Educational Codeforces Round 62 (Rated for Div. 2) F. Extending Set of Points(可撤销并查集+线段树分治)

CodeForces_1348EF – Phoenix and Memory 贪心+线段树找区间最小值 这题如果没有输出2个解就很简单。 是个之前做过的类型: 把所有限制按R排序, 然后每次取出R最小的,然后从其L开始选,尽量选能选的中最小的。 这样选如果能选完,就说明有解。 贪心正确性显然:R大的至少可以选则R做为点来用。所以按R升序遍历,每次优先选左边的,能让后边的可选的更多。 用set维护可选的数即可。 这题加了个输出2个方案。 我们考虑最简单的情况:即确定一个序列后,是否有2个位置,posi,posj,使得i,j可以交换。 显然必须满足    Lj<=posi<posj<Ri 我们枚举i,只需要找到任意一个j满足上式,就可以交换i,j然后输出。 我们可以先把所有的Lj存到以 posj为区 立即下载

题目

给定二维平面的集合S,扩展集合E(S)首先被定义为S,然后开始往里面加点

任取S内集合的三个点,如果它们能构成矩形的三个顶点,则把矩形的第四个顶点也加到E(S)里

最终的E(S),是不能再往里面加新的不存在的点的最大点集

现在给定初始为空的集合S,以下q(q<=3e5)个操作,

第i次给出一个点Pi(xi,yi),

①如果Pi已经在S中,就将Pi从S中删去

②否则将Pi加入到集合S中

每次操作后,询问当前E(S)集合的大小

思路来源

https://codeforces.com/blog/entry/66147(官方tutorial)

https://www.cnblogs.com/CJLHY/p/10606629.html

https://blog.youkuaiyun.com/ccsu_cat/article/details/88834535

https://www.cnblogs.com/uuzlove/p/10585235.html

题解

官方题解的大意,

把x轴抽象成点,把y轴也抽象成点,把形如(x,y)的点抽象成边,去连接坐标轴被抽象成的点。

每个点对应一个集合,集合内cntx[]记录这个集合内有多少条x轴线,cnty[]记录有多少条y轴线,

想象网格纸,若干条交叉线,如果一个集合内有这些x轴的线和y轴的线,

那么一定可以补全交叉线上的所有点,因为这每一条线的出现都是因为这条线上的一个点的存在,

而这些线被合并到一个集合里去,是因为一个点可以将两条线合并到一起

 

由于除插入外还有删除操作,所以考虑可撤销并查集,离线地考虑询问的事件。

将插入和删除点,转化为这个点在[L,R]事件内是存在的,按事件的时间戳建一个线段树,

如果这个点没有删除,可以认为保留到了事件尾,处理成[L,q]即可

线段树内节点(p,l,r)的vector维护的是在[l,r]事件内都存在的点,

所以可以类似区间染色问题,把每个点所代表的[l,r]事件分解成O(logq)段,添加进线段树上对应节点的vector

维护一个并查集和当前值的答案now,根据dfs序对线段树进行遍历,

当进入一个线段树上的节点时,先将这个节点存的点在并查集上进行修改,

如果已经dfs到叶了,说明当前now值就是对应事件的答案,

离开一个节点的时候,应该撤销对并查集的修改,

可撤销并查集类似于数据库刚讲的rollback回滚问题,即要回滚哪些值,即提前在日志里备用上这些值,

那么我们维护一个栈,来逆序恢复,

由于栈内存的是两棵树的树根,所以撤销的时候直接让树根恢复为树根,不用存别的sz[]、cnt[]、par[]值了

特别地,这里的并查集不能使用路径压缩,因为涉及撤销操作,sz[]用于按秩(实际是大小)合并保证复杂度

四点半睡不着起来补题可还行

代码

#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define lson p<<1,l,mid
#define rson p<<1|1,mid+1,r
using namespace std;
typedef long long ll;
const int maxn=3e5;
const int N=maxn+10;
typedef pair<int,int> P;
map<P,int> last;//last[P]代表这个点上一次存在的位置
vector<P>dat[4*N];//储存点坐标的线段树向量 
//把点i处理成在[li,ri]询问内,点i存在
//从而处理成线段树染色问题 如果完整区间包含就不递归子树 称线段树分治
//dfs序访问线段树的树 进入时修改 离开时撤销 用可撤销并查集维护 
int n,par[2*N],cntx[2*N],cnty[2*N],sz[2*N];
P a;
ll now,ans[N];
int find(int x)
{
	return par[x]==x?x:find(par[x]);//不带路径压缩,因为要撤销 
}
void merge(int x,int y,stack<P> &q)
{
	x=find(x),y=find(y);
	if(x==y)return;
	//按秩合并 按disjoint集合大小合并 小的向大的合 这里不维护高度 
	if(sz[x]<sz[y])swap(x,y);
	now-=1ll*cntx[x]*cnty[x];//在用到int*int时,转1ll 
	now-=1ll*cntx[y]*cnty[y];
	q.push(P(x,y));//用栈保留更改 由于记录的是两棵树的树根 逆序撤销时只需令par[y]=y即可 
	sz[x]+=sz[y]; 
	cntx[x]+=cntx[y];
	cnty[x]+=cnty[y];
	par[y]=x;
	now+=1ll*cntx[x]*cnty[x];
}
void undo(stack<P> &q)//撤销线段树上这个结点的操作 
{
	while(!q.empty())
	{
		int x=q.top().fi;
		int y=q.top().se;
		q.pop();
		now-=1ll*cntx[x]*cnty[x];
		sz[x]-=sz[y];
		cntx[x]-=cntx[y];
		cnty[x]-=cnty[y];
		par[y]=y;//将y还原为没合并之前的树根y
		now+=1ll*cntx[x]*cnty[x];
		now+=1ll*cntx[y]*cnty[y]; 
	} 
} 
void update(int p,int l,int r,int ql,int qr,P v)
{
	if(ql<=l&&r<=qr)
	{
		dat[p].pb(v);
		return;
	}
	int mid=(l+r)/2;
	if(ql<=mid)update(lson,ql,qr,v);
	if(qr>mid)update(rson,ql,qr,v);
}
void dfs(int p,int l,int r)
{
	stack<P>q;
	for(auto v:dat[p])//处理当前节点所包含区间的事件 
	merge(v.fi,v.se,q); 
	if(l==r)ans[l]=now;
	else
	{
		int mid=(l+r)/2;
		dfs(lson);
		dfs(rson);
	}
	undo(q);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d%d",&a.fi,&a.se);
		a.se+=maxn;
		if(last.count(a))
		{
			update(1,1,n,last[a],i-1,a);//a实际存在的事件时刻是[last[a],i-1]
			last.erase(a); 
		}
		else last[a]=i;
	}
	for(auto v:last)//没有被删掉的 认为存在到事件尾 
	update(1,1,n,v.se,n,v.fi);//第一维点对 第二维位置 
	for(int i=1;i<=maxn;++i)
	par[i]=i,sz[i]=1,cntx[i]=1;
	for(int i=maxn+1;i<=2*maxn;++i)
	par[i]=i,sz[i]=1,cnty[i]=1;
	dfs(1,1,n);//按dfs序,即前序,遍历线段树
	for(int i=1;i<=n;++i)
	printf("%I64d%c",ans[i],i==n?'\n':' ');
	return 0;
}

 

第4章 Stata参数检验 目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验(Parameter Test)是指对参数的平均值、方差、比率等特征进行的统计检验。参数检验一般假设统计总体的具体分布为已知,但是其中一些参数或者取值范围不确定,分析的主要目的是估计这些未知参数的取值,或者对这些参数进... 阅读详情

相关推荐

自制电吉他效果器 DIY PCB(二)电路图分析

自制DIY电吉他效果器 PCB(二)电路图分析 要自制一款效果器,看懂电路图是必须的,即使你已经有了完整的设计电路图,在电路的绘制已久焊接的时候电路知识都会用到。 在效果器电路中,比较简单的是过载失真类效果器的电路。混响延迟等与声相有关的由于电路比较复杂本人也没有尝试过。其他的例如EQ、哇音等等效果器复杂程度依设计各不相同,在能做出过载失真类效果器后,可以自行尝试。 我这里主要为大家介绍失真效果器...

qq_41342525的博客 2万+

Codeforces1042D——线段树|树状数组|分治+尺取

题目链接:https://vjudge.net/contest/357503#problem/D 题目大意: 给你一个由n个整数组成的数组a,请你计算二元组(l,r)的个数,其中(l,r)满足条件 Input 第一行两个整数n和t (1 ≤ n≤ 200,000 ,|t|≤ 2e14 ) 第二行为一个序列:a1,a2...an,注意可能有负数和零 Output 二...

mumei的博客 595

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流

本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。

weixin_29246195的博客 575

CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1 x y1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间没有连边,则增加连边;如果 (x,y)(x,y)(x,y) 之间存在连边,则删除连边 2 x y2 \ x \ y2 x y:询问点 xxx 和点 yyy 之间是否联通 询问需要强制在线 题目分析:关于强制在线实现连边与加边

Falcon的博客 589

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3793

VS2022+Qt6保姆级配置指南:从插件安装到项目互通全流程(附常见错误解决)

本文提供了一份详细的Visual Studio 2022与Qt6集成开发环境配置指南。从插件安装、环境搭建到项目创建与互通,涵盖了全流程操作步骤,并针对常见的配置错误和调试问题提供了实用的解决方案,帮助开发者高效构建企业级桌面应用。

nginx7reverse的博客 1203

Codeforces 1444C 可撤销并查集

题意 传送门 Codeforces 1444C Team-Building 题解 图中节点划分为不相交的点集 SSS,求满足所构成子图为二分图的点集对 (S1,S2)(S_1,S_2)(S1​,S2​) 数量。 若点集 SSS 构成的子图存在奇环,则它与任意其他点集构成的子图都不可能是二分图。讨论满足二分图判定的点集即可。 若两点间存在一条边,则两点划分至不同的集合,可以通过并查集维护这样的关系。依次考虑点集 SSS,处理与它存在连边的点集 TTT,判断 S,TS,TS,T 构成的子图是否为二分图即可。可以

neweryyy的博客 775

阿里数据集(cluster-trace-v2018)提取

阿里数据集提取 本数据集采用的是阿里集群数据集-2018 详情可参考该文献:https://blog.csdn.net/weixin_41988248/article/details/92431588 CSV数据集提取操作见:https://blog.csdn.net/lucky_shi/article/details/105321149 关于read_csv包的用法见:https://blog.csdn.net/dc19971118/article/details/107721340 从阿里数据集来看,我

5-StarrySky的博客 3340

可撤销并查集+MST思想-Codeforces891C

可撤销并查集,采用启发式按秩合并 struct Undo_Dsu { stack <pii> st ; int fa[N] , siz[N] ; void init() { while(!st.empty()) st.pop() ; for (int i = 1 ; i <= n ; i ++) fa[i] = i , siz[i] = 1 ; } int findroot(int x) { .

Zenith_Habitant的博客 3733

链式中介效应结果解读:从Bootstrap置信区间到实践意义

本文深入解析链式中介效应结果的解读方法,从Bootstrap置信区间的应用到实践意义的阐述。通过实际案例展示如何分析总效应、直接效应和间接效应,并强调效应量评估的重要性。文章还提供了构建逻辑解释的三步法,以及敏感性分析和报告撰写的实用技巧,帮助研究者准确解读链式中介效应。

weixin_33690367的博客 718

基于 YOLOv26 的食品包装缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习的食品包装缺陷智能检测系统。该系统能够自动识别多种常见包装缺陷,包括密封不良、破损、污染、标签错误等8类问题。相比传统人工检测方法,该系统具有高精度、多类别分类、实时推理等优势。文章详细介绍了系统架构,包含数据采集、预处理、YOLOv26检测模型和后处理四个核心模块,并提供了完整的环境配置和数据处理代码实现。该系统为食品包装行业提供了一种高效、准确的智能视觉质检解决方案。

一键难忘的博客 681

codeforces 1217 F(时间线段树+可撤销并查集)

题目链接:https://codeforc.es/contest/1217/problem/F 思路:没有那个在线的话,就完全是一道裸题,而那个在线可以发现总共只有两种可能,那么完全可以当做离线的来做,加些判断就行了 #pragma GCC optimize(3) #include <unordered_map> #include <cstdio> #include ...

llmxby 408

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4452

2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树

目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(10000)\)条边,每无向边允许通过编号在\([Li,Ri](1\le Li\le Ri\le ...

ako2654的博客 354

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

codeforces 并查集_codeforces 892E 可撤销并查集

https://codeforces.com/problemset/problem/892/E把询问离线,分步回答.#include#define ll long long#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)#define per(ii,a,b) for(int ii=b;ii>=a;--ii)#define forn(i,x,g,e...

weixin_39625098的博客 193

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CodeForces - 1445E Team-Building(可撤销并查集)

题目链接:点击查看 题目大意:给出一张有 n 个点和 m 条边的图,每个点都有一个种类,共有 k 个种类,现在要从 k 个种类中每次选出两种,对所有C( k , 2 ) 种组合单独讨论,对于选出的两个种类中,包含的所有的点以及其连边所组成的子图,如果该子图可以拆分成二分图,那么答案加一 题目分析:参考博客:https://blog.csdn.net/Zenith_Habitant/article/details/109451857 k 的范围很大,正难则反,考虑计算不合法的组合个数,然后由总的合法个.

Falcon的博客 993

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Codeforces 938G 线段树分治 线性基 可撤销并查集

Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问x到y的路径异或最小值 保证图在任意时刻连通 首先连通图路径异或相当于从x到y的任意一条路径再异或上若干个环得到的,只要在dfs过程中把非树边成的环丢到线性基里就好了,其他环一定可以通过这些...

a8786的博客 265

Maze 2D 【CodeForces - 413E】【线段树+状态转移思维】

题目链接 这道题不能直接用dp[][]等方式来寄存数据,所以得想办法去进行优化,于是乎,就是想到了线段树的优化作用,我们可以这样子去推一个状态转移,如图: 最后拍照下来的图像是反的…… QAQ…… 但就是这样的一个意思,我们可以这样去推状态方程,然后记录在线段树上面即可。 具体可以参考一下代码。 #include &lt;iostream&gt; #inclu...

既然弱小,就只顾变强就是了 464

CodeForces - 892E Envy(可撤销并查集)

题目链接:点击查看 题目大意:给出一张由 n 个点 m 条边组成的连通图,有 q 次询问,每次询问给出一个边集,需要判断这些边是否可以同时出现在最小生成树上 题目分析:需要用到的一个性质是,对于同一个询问来说,不同权值的选择是相互独立的,但是相同权值之间会相互影响,所以我们可以对每个询问的每条边单独拿出来讨论 在进行正常的最小生成树的操作时,对于每次操作的当前边 i ,需要处理所有询问中边权与当前边权相等的边,因为当前处理的这些询问的边权都相等,所以我们按照询问的 id 分组单独讨论,对于每个 id

Falcon的博客 743

2020牛客暑期多校训练营(第八场)A.All-Star Game(线段树+带撤销并查集)

题目链接:https://ac.nowcoder.com/acm/contest/5673/A 直接线段树维护每一个关系的生命周期,加一个带撤销并查集,然后dfs更新答案就行了 题目倒是不难写,mark一个带撤销并查集的板子 代码: #include<bits/stdc++.h> #define xx first #define yy second #define mp make_pair #define pb push_back using namespace std; ..

bibibibi的博客 328

【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下。 首先做这题之前推荐一道很相似的题:【BZOJ4025】二分图(可撤销并查集+线段树分治) 大力每个颜色维护一个并查集,就很像上面那道题了。但是存在一个问题:在处理线段树区间[l,r][l,r][l,r]时,可能并不知道lll处的修改是否成功,所以不知道lll处修改的边具体是什么颜色...

Inspector_Javert 730

Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) E.Team-Building 可撤销并查集

题目链接 思路:转换题意就是求选两个不同的组构成的子图是一个二分图。 那么可以先把一些自身就构成奇环的点找出来,这些点别的组也不能选。 接下来我们对连接不同组的边进行分类讨论,因为显然两个组构成奇环肯定环上只有两个组中的点(自身构成奇环的已经被扣掉了)。那么对每一组都用并查集来check是否合法。由于有很多不同的组,那么就用可撤销并查集来撤销上一次的merge即可。 #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc+

pubgoso的博客 345

Codeforces 1140 F Extending Set of Points —— 线段树分治+并查集

This way 题意: 每次给你一个二元组,如果这个二元组不存在,就插到集合S中,如果存在,就将其删除。 并且,你现在有一个集合R,R=S,接下来重复一个操作,如果S中有三个点(x1,y1),(x2,y1),(x1,y2)且没有(x2,y2),将(x2,y2)插到R中。 每次输入结束之后,问你R集合中有多少个点 题解: 对于每一个点,将它y所属的集合加到x所属的集合中,然后对于这个集合的答案就是...

天翼之城的博客 270

Codeforces 938G Shortest Path Queries 线段树分治+并查集+线性基

题意 给出一个连通带权无向图,边有边权,要求资瓷q个操作: 1 x y d在原图中加入一条x到y权值为b的边 2 x y把图中x到y的边删掉 3 x y表示询问x到y的异或最短路 保证任意操作后原图连通无重边自环且操作均合法 n,m,q&lt;=200000 分析 如果没有前两个操作的话,我们就可以把原图的dfs树建出来,那么x到y的异或最短路就是它们在dfs树上的路径再异或上...

beginend 681

[均摊复杂度线段树]Codeforces 438D. The Child and Sequence

首先一个数模一个小于它的数,肯定会变成原来的一半那么用均摊复杂度线段树的套路,记一下区间最大值,区间取模时,如果区间最大值小于模数,那么不会改变数列,直接退出,否则暴力递归。每个点最多变化log次,复杂度应该就是 O(nlog2n)O(n\log^2n)#include <cstdio> #include <iostream> #include <algorithm>using namespace

CE玩家 468

Codeforces 1140F 线段树 分治 并查集

题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接并查集搞一搞就行了。对于这个题,因为有删除操作,我们对操作序列建一颗线段树,记录每个操作影响的区间操作就可以了。这里的并查集不能路径压缩,要按秩合并,这样复杂度是O(logn)的。 代码: ...

weixin_30663391的博客 159
上一篇: UVA11997 K Smallest Sums(思维题/优先队列)
下一篇: Codeforces Round #569 (Div. 2) (D/构造+E/线段树)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值