当前位置: 首页 > news >正文

CF1290C Prefix Enlightenment 题解

Solution

不难注意到“任意三个子集的交集为空”等价于每盏灯最多同时出现于 \(2\) 个集合中。

设第 \(i\) 盏灯出现在第 \(p_i,q_i\) 两个集合中,若没有则为 \(0\)。设 \(f_k\in \{0,1\}\) 表示是否选集合 \(A_k\)

然后依据题意从左向右扫,分讨第 \(i\) 盏灯的情况。

  1. \(p_i=q_i=0\):一定有 \(s_i=1\),答案与这盏灯无关。
  2. \(p_i\neq 0,q_i=0\):仅 \(A_{p_i}\) 影响该灯,故 \(f_{p_i}=\operatorname{not} s_i\)
  3. \(p_i\neq 0,q_i\neq 0\):该灯同时受两个集合影响,必有 \(f_{p_i}\operatorname{xor} f_{q_i}=\operatorname{not}s_i\)

考虑图论建模,将约束转化成带权无向边。

  • 对于 \(f_{p_i}=c\) 型的约束,新建一个虚点 \(0\),在 \(p_i,0\) 间建边权为 \(c\) 的无向边。
  • 对于 \(f_{p_i}\operatorname{xor} f_{q_i}=c\) 型的约束,在 \(p_i,q_i\) 间建边权为 \(c\) 的边。

不难发现此时要维护的是一个 01 二分图。每个连通块的代价为左部点和右部点数的较小值。特别地,如果点 \(0\) 在该连通块中,则代价为与 \(0\) 不在同一部分的点数。

然后用带权并查集维护即可,具体细节详见代码。

AC Code

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i(a);i<b;++i)
#define rept(i,a,b) for(int i(a);i<=b;++i)
using namespace std;
constexpr int N=3e5+5;
int fa[N],w[N],siz[N][2];
int n,k,c,ans;  // ans:当前总代价
char s[N];
vector<int> g[N];
// w[i]:点i的父边权值
// siz[i][0]:和根节点i在同一部分的点数
// siz[i][0]:和根节点i在不同部分的点数
int find(int x){if(fa[x]==x) return x;int t=find(fa[x]);w[x]^=w[fa[x]];return fa[x]=t;
}
int calc(int u){  // u所在连通块的代价if(find(0)==u) return siz[u][w[0]^1];  // 与 $0$ 不在同一部分的点数return min(siz[u][0],siz[u][1]);  // 左部点和右部点数的较小值
}
void merge(int x,int y,int k){int u=find(x),v=find(y),z=k^w[x]^w[y];if(u^v){  // 千万别忘了判ans-=calc(u),ans-=calc(v);w[u]=z;siz[v][0]+=siz[u][z];siz[v][1]+=siz[u][z^1];fa[u]=v;ans+=calc(v);}
}
signed main(){scanf("%d%d%s",&n,&k,s+1);rept(i,1,k) fa[i]=i,siz[i][0]=1;rept(i,1,k){cin>>c;while(c--){int x;scanf("%d",&x);g[x].emplace_back(i);}}rept(i,1,n){if(g[i].size()==2) merge(g[i][0],g[i][1],s[i]=='0');else if(g[i].size()==1) merge(g[i][0],0,s[i]=='0');printf("%d\n",ans);}return 0;
}
http://www.jsqmd.com/news/289357/

相关文章:

  • ◆comfyUI教程◆第2章11节 Latent基础与应用控制 - 实践
  • 2026山东最新山东卓越全程土地房地产评估有限公司资产评估_房地产评估_股权评估_损失评估_数据资产评估机构首选推荐:山东专业机构,全方位服务值得信赖.
  • Matlab调用downloadCIFARData和loadCIFARData出错
  • 顶刊中的“水刊”!IEEE Trans系列,含金量拉满,3天初审,中一篇可躺平!
  • springboot基于微信小程序的高校毕业生公考助手管理系统
  • 从黑土到云端,富裕县年货节开启乡村振兴数字新篇
  • 2026年国产控油粉底液专业深度测评:排名前五品牌权威发布
  • mysql二进制日志清理
  • 2026年租车厂家权威推荐榜:免押金租车、商务租车、四川租车公司、团体租车、成都汽车租赁、成都汽车租赁公司、成都租车选择指南
  • 2026年专业深度测评:国产控油粉底液排名前五权威榜单
  • 2026山东最新资产评估事务所top5推荐!潍坊等地专业评估机构权威榜单发布,资质全面服务多元助力资产价值精准评估.
  • 华为耳机这3个隐藏技能,把实用性拉满!
  • 2026年四川夜景照明工程哪家好?五大优质厂家深度推荐,众奇光彩领跑文旅夜游与城市亮化新赛道
  • GitHub Issues 集成
  • 2026年评价高的磁力泵公司推荐:氟塑料磁力泵/液下化工泵/耐腐蚀化工泵/耐腐蚀磁力泵/耐酸磁力泵/自吸化工泵/选择指南
  • 基于SpringBoot和Vue的实验报告管理系统的设计与实现
  • 新加坡最好的硕士留学机构,申请成功率高,助您留学无忧
  • 南京展会设计公司2026年度推荐:品质之选,展览搭建/展厅制作/展览设计/展厅装修/会场搭建/展位设计,展会设计企业推荐
  • 郑州硕士留学中介口碑排名为何领先?学员满意度高给出答案
  • 诚信租车推荐榜 高性价比优质服务商精选
  • Windows 电脑操作一键自动化任务神器
  • 继续教育论文数据造假会怎样?这条红线千万别碰
  • 软件研发 --- 安卓开发 之 Android 16 KB 页大小
  • 基于精益建造的预制构件准时交付优化【附模型】
  • 商业航天高可靠PCBA制造:抗辐射CAN收发器SMT贴装关键技术及系统级挑战
  • 彻底修复Linux服务器软件更新404错误
  • springboot基于顾客偏好的唯品会推荐系统设计与实现
  • springboot基于微信小程序的电子元器件商城管理系统
  • springboot基于微信小程序的付费自习室系统设计与实现
  • Linux磁盘空间满了怎么办,磁盘清理