• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

CF1290C Prefix Enlightenment (并查集)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

大意: 给定长$n$的01串$s$, 给定$k$个集合$A_1,...,A_k$,保证任意三个集合交集为空. 每次操作选择一个集合,翻转$s$中对应位置. 定义$m_i$为使前$i$个位置全为$1$所需的最少操作数(题目数据保证每个$m_i$都存在), 求所有$m_i$的值.

 

 

显然每个位置最多属于两个集合.

假设只对应一个集合$X$, 那么$X=\overline{s_i}$

假设对应集合$X,Y$, 那么$X\oplus Y=\overline{s_i}$

所以题目就等价于给定一些异或方程组, 求最少多少个变量值为1.

考虑把每个集合拆成两个点$X_1,X_0$表示选或不选. 

对于$X\oplus Y=1$, 就连边$(X_1,Y_0),(X_0,Y_1)$

对于$X\oplus Y=0$, 就连边$(X_1,Y_1),(X_0,Y_0)$

对于$X=\overline{s_i}$, 有一个技巧是设一个权值无穷大的点, 限制$X$不能选$s_i$.

可以用并查集实现, 选一个权值和最小的连通块即可. 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
const int N = 1e6+10;
int n, k, fa[N], val[N];
char s[N];
vector<int> g[N];
int Find(int x) {return fa[x]?fa[x]=Find(fa[x]):x;}
void add(int x, int y) {
	x = Find(x), y = Find(y);
	if (x!=y) fa[x]=y,val[y]+=val[x];
}
int calc(int x) {
	return min(val[Find(x)],val[Find(x+k)]);
}

int main() {
	scanf("%d%d%s",&n,&k,s+1);
	REP(i,1,k) {
		int x, t;
		scanf("%d",&x);
		while (x--) {
			scanf("%d", &t);
			g[t].pb(i);
		}
	}
	REP(i,k+1,2*k) val[i] = 1;
	val[2*k+1] = INF;
	int ans = 0;
	REP(i,1,n) {
		if (g[i].size()==1) {
			ans -= calc(g[i][0]);
			if (s[i]=='1') add(g[i][0]+k,2*k+1);
			else add(g[i][0],2*k+1);
			ans += calc(g[i][0]);
		}
		else if (g[i].size()==2) {
			int x = g[i][0], y = g[i][1];
			if (Find(x)!=Find(y)&&Find(x)!=Find(y+k)) {
				ans -= calc(x)+calc(y);
				if (s[i]=='1') add(x,y),add(x+k,y+k);
				else add(x+k,y),add(x,y+k);
				ans += calc(x);
			}
		}
		printf("%d\n", ans);
	}
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#编码规范发布时间:2022-07-13
下一篇:
C#设计模式(9)-Prototype Pattern发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap