[CF1140F] Extending Set of Points

相当套路而巧妙的构造。


假如我们对于横纵坐标构造二分图,然后用如下方法连边:

  • 对于点 \((x,y)\),连接 \(x,y\)

那么对于一个有 \(num_x\) 个横坐标点和 \(num_y\) 个纵坐标点的连通块,它所产生的贡献就是 \(num_x\times num_y\)

这玩意儿需要联通块和删除,考虑线段树分治 \(+\) 可持久化并查集。

时间复杂度 \(O(n\log^2n)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e5+5;
struct ed{int x,y;};
bool operator<(ed x,ed y){
	return (x.x!=y.x)?x.x<y.x:x.y<y.y;
}set<ed>st;vector<ed>g[4*N];
int n,ans,fa[N],sz[N],sx[N];
unordered_map<int,int>mp[N];
struct mer{
	int sz,sx,x,y;
};stack<mer>sk;
inline void init(){
	for(int i=1;i<=6e5;i++)
		fa[i]=i,sz[i]=1,sx[i]=(i<=3e5);
}inline int find(int x){
	return fa[x]==x?x:find(fa[x]);
}inline void unite(int x,int y){
	x=find(x),y=find(y);
	if(x==y) return;
	if(sz[x]<sz[y]) swap(x,y);
	sk.push({sz[x],sx[x],x,y});
	ans-=(sz[x]-sx[x])*sx[x];
	ans-=(sz[y]-sx[y])*sx[y];
	fa[y]=x,sz[x]+=sz[y],sx[x]+=sx[y];
	ans+=(sz[x]-sx[x])*sx[x];
}inline void chg(int x,int l,int r,int L,int R,ed e){
	if(L>R) return;
	if(L<=l&&r<=R){
		g[x].push_back(e);
		return;
	}int mid=(l+r)/2;
	if(L<=mid) chg(x*2,l,mid,L,R,e);
	if(R>mid) chg(x*2+1,mid+1,r,L,R,e);
}inline void solve(int x,int l,int r){
	int ltp=sk.size();
	for(auto e:g[x]) unite(e.x,e.y);
	int mid=(l+r)/2;if(l==r) cout<<ans<<" ";
	else solve(x*2,l,mid),solve(x*2+1,mid+1,r);
	while(sk.size()>ltp){
		mer x=sk.top();sk.pop();
		ans-=(sz[x.x]-sx[x.x])*sx[x.x];
		fa[x.y]=x.y,sz[x.x]=x.sz,sx[x.x]=x.sx;
		ans+=(sz[x.x]-sx[x.x])*sx[x.x];
		ans+=(sz[x.y]-sx[x.y])*sx[x.y];
	}
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n,init();
	for(int i=1,x,y;i<=n;i++){
		cin>>x>>y;
		if(mp[x][y]){
			chg(1,1,n,mp[x][y],i-1,{x,y+3e5});
			mp[x][y]=0,st.erase({x,y});
		}else mp[x][y]=i,st.insert({x,y});
	}for(auto x:st)
		chg(1,1,n,mp[x.x][x.y],n,{x.x,x.y+3e5});
	solve(1,1,n);
	return 0;
}
posted @   长安一片月_22  阅读(5)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示