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

qoj1847 Elephants

题意

有一个长度为 \(n\)\(01\) 数组 \(a\)

给出 \(q\) 组限制条件,第 \(i\) 组给出大小为 \(k_i\) 的集合 \(C_i=\{x_{i,1},x_{i,2},\cdots,x_{i,k_i}\}\)。若 \(cnt_0\)\(\{x|x\in C_i,a_x=0\}\) 的集合大小,\(cnt_1\)\(\{x|x\in C_i,a_x=1\}\) 的集合大小,则保证 \(|cnt_0-cnt_1|\le 1\)

且保证若存在 \(i\neq j,x,y,z\)\(x\in C_i,x\in C_j,y\in C_i,z\in C_j\),则有 \(y\in C_j\)\(z\in C_i\)

求出一组可能的 \(a\),或判断无解。

思路

由题意得,对于两个不同的集合 \(C_i,C_j\pod{i\neq j}\),只可能存在不交和包含的关系。

将限制条件按照大小排序,我们便可以把限制条件表示为一棵树的关系,每个节点分为它的子节点和下面没有包含的颜色部分,如下图:

其中黑色部分表示这个限制条件包含的节点,红色部分表示下面没有包含的颜色部分。

可以发现,如果限制条件的长度为偶数,那么就只有一半 \(0\) 一半 \(1\) 的填法,但是如果为奇数,那么就可以多填一个 \(0\) 或者多填一个 \(1\)

于是对于每个限制条件,让它的所有长度为奇数的子节点以多一个 \(0\) 和多一个 \(1\) 的形式交错,最后再确定自己的红色部分即可。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,a[1000005],id[1000005],be[1000005],tp[1000005];
vector<int> t[1000005],e[1000005];
bool cmp(int x,int y){return t[x].size()>t[y].size();
}
void dfs(int x,int mr){vector<int> mc;for(int v:t[x])if(be[v]==x) mc.push_back(v);for(int v:e[x]){if(t[v].size()%2==1){if(mr==1) dfs(v,1);else dfs(v,0);mr^=1;}elsedfs(v,0);}int c=0;if(mc.size()%2==0){for(int v:mc){c++;if(c<=mc.size()/2) a[v]=0;else a[v]=1;}}else{for(int v:mc){c++;if(c==mc.size()) a[v]=mr;else if(c<=mc.size()/2) a[v]=0;else a[v]=1;}}
}
signed main() {ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>n>>m;for(int k,i=1;i<=m;i++){cin>>k,id[i]=i;for(int x,j=1;j<=k;j++)cin>>x,t[i].push_back(x);}sort(id+1,id+1+m,cmp);for(int i=1;i<=m;i++){if(!be[t[id[i]][0]])e[0].push_back(id[i]);elsee[be[t[id[i]][0]]].push_back(id[i]);for(int v:t[id[i]])be[v]=id[i];}dfs(0,0);for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}
http://www.wxhsa.cn/company.asp?id=2533

相关文章:

  • p4085
  • Excel甘特图 - 教程
  • 基于ArcGIS的通用界址点导入导出工具设计与实现
  • python 函数作用域
  • 基于Python+Vue开发的鲜花商城管理系统源码+运行
  • 文献阅读 | AutoCodeBench
  • 【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】
  • Idea win 快捷键大全
  • VSCode+neovim工作环境快速构建
  • 25.9.12随笔联考总结
  • macos
  • Java基础程序设计
  • CF482C Game with Strings
  • 算法复杂度
  • 0912模拟赛总结
  • 相机标定
  • 深度学习隐私测试框架PrivacyRaven全面解析
  • 华硕灵耀双屏不定时死机,开机蓝屏 其一解决方法
  • 完整教程:Java 抽象(abstract)关键字
  • 自建rustdesk服务器,不填写中继地址无法连接的解决
  • Typescript中Type 类型的实现原理
  • 2025.9.13——1黄
  • 数据结构与算法-30.图-拓扑排序
  • 1.进制转化
  • CF1796E Colored Subgraphs
  • 安全加固:启动PostgreSQL 14服务器SSL加密的方法指南在CentOS 7环境中
  • 更美观的网页布局
  • 更灵活易用、延迟超低、更多情感语音支持!地表最强 Voice Agent 开源框架再进化!丨TEN Framework 更新
  • 详细介绍:【干货收藏】Transformer架构深度拆解:大模型入门核心指南
  • 实用指南:Terraform 从入门到实战:历史、原理、功能与阿里云/Azure 上手指南