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

LGP9869 [NOIP 2023] 三值逻辑 学习笔记

LGP9869 [NOIP 2023] 三值逻辑 学习笔记

\(\texttt{Luogu Link}\)

题意简述

\(\texttt{L}\) 今天学习了 \(\texttt{Kleene}\) 三值逻辑。

在三值逻辑中,一个变量的值可能为真、假、未定。记为 \(T,F,U\)

在三值逻辑上也可以定义逻辑运算。小 \(\texttt{L}\) 现在只学了逻辑非运算:\(\neg T=F,\neg F=T,\neg U=U\)

现在,小 \(\texttt{L}\)\(n\) 个三值逻辑变量 \(x_1,\cdots,x_n\)。他写下了 \(m\) 个语句,有以下三种:

  • \(x_i\gets v\)\(v\in \{T,F,U\}\)
  • \(x_i\gets x_j\)
  • \(x_i\gets \neg x_j\)

一开始,小 \(\texttt{L}\) 会给这些变量赋初值,然后按顺序运行这 \(m\) 条语句。小 \(\texttt{L}\) 希望执行了所有语句后,所有变量的最终值与初值都相等。在此基础上他想最小化初值中 \(U\) 的数量。请求出这个最小值。

\(n,m\le 10^5\)。保证所有数据必然有解。

做法解析

首先这种关系赋予连结看着就像并查集题目,题中出现了 \(x_i\gets \neg x_j\),所以当然对于每个 \(i\)\(x_i\)\(x_{i+n}=\neg x_i\) 两个点。

这个套路对于解题的必要性在于可以通过“有 \(x_i\)\(\neg x_i\) 处于同一连通块”来判不合法或无解之类的。

既然要最终值与初值相等,我们当然关心这些变量的终值是哪儿来的,所以我们记 \(src_i=j\),意为 \(i\) 的终值来源于 \(j\) 的初值。对于每一条语句,显然相当于执行:\(src_i\gets src_j\)\(\neg src_i\gets \neg src_j\)

对。执行 \(m\) 条语句这步实际上不涉及到并查集。你在这用并查集就错了。比如 \(x_1\)\(=x_2\)\(=x_3\),你并查集把它们全连起来那肯定错了。倒着做只管终值也做不了,因为你不知道终值的来源的来源可以追溯到哪。

最后你按着 \(src\) 去做并查集的 merge() 就行了。这个不需要我教你了吧。

代码实现

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
int N,M,X,Y;char ch;
int TT,FF,UU,src[MaxN<<1];
struct UnionFind{int n,ufa[MaxN<<1];void init(int x){n=x;for(int i=1;i<=n;i++)ufa[i]=i;}int find(int u){return ufa[u]==u?u:ufa[u]=find(ufa[u]);}void merge(int u,int v){ufa[find(v)]=find(u);}bool judge(int u,int v){return find(u)==find(v);}
}UnF;
void addb(int u,int o){if(o==1)src[u]=TT,src[u+N]=FF;if(o==2)src[u]=FF,src[u+N]=TT;if(o==3)src[u]=src[u+N]=UU;
}
void addn(int u,int v,int k){src[u]=src[v];src[u+N]=src[v+N];if(k)swap(src[u],src[u+N]);
}
int ans;
void mian(){readis(N,M);UnF.init(N*2+3);TT=N*2+1,FF=N*2+2,UU=N*2+3;for(int i=1;i<=N*2+3;i++)src[i]=i;for(int i=1;i<=M;i++){scanf(" %c",&ch);if(ch=='T')readi(X),addb(X,1);if(ch=='F')readi(X),addb(X,2);if(ch=='U')readi(X),addb(X,3);if(ch=='+')readis(X,Y),addn(X,Y,0);if(ch=='-')readis(X,Y),addn(X,Y,1);}for(int i=1;i<=N*2+3;i++)UnF.merge(i,src[i]);ans=0;for(int i=1;i<=N;i++)ans+=(UnF.judge(i,i+N)||UnF.judge(i,UU));writil(ans);
}
int Tpn,Tcn;
int main(){readis(Tpn,Tcn);while(Tcn--)mian();return 0;
}

后记

实际上题目不需要特别保证“必定有解”,因为有解是必然的。对于并查集而言,某个连通块只要里面不包含 \(T,F\),那你全赋值 \(U\) 就必定合法。包含 \(T,F\) 的时候,\(u=T\) 时总有 \(\neg u=F\),所以它们的终值不会搅和(感性理解一下)。

http://www.hskmm.com/?act=detail&tid=30681

相关文章:

  • Windows 程序开机自启的方法
  • 详细介绍:全球资本开支激增,就业增长停滞:AI时代的双刃剑
  • 2025 年昆明商务车总代理推荐艾维诺:16 年深耕高端定制与销售,奔驰丰田等品牌优选服务商
  • java面向对象
  • Chrome 安装失败且提示“无可用的更新” 或 “与服务器的连接意外终止”,Chrome 离线版下载安装教程
  • keepalived日志报错Error exec-ing command /usr/local/keepalived/chk.sh, error 8: Exec format
  • 2025 年国内树脂瓦厂家最新推荐排行榜:聚焦品质与服务,助力建筑屋面选材更可靠PVC/asa 加厚合成 / FRP/PET 树脂瓦厂家推荐!
  • 2025 年隔音板厂家最新推荐排行榜:阻尼 / 聚酯纤维 / 室外等多品类适配,聚焦口碑厂商与一站式服务
  • 2025-10-13
  • 剑指offer-34、第⼀次出现的字符
  • 斜率优化DP
  • 2025 年海运服务最新推荐排行榜:聚焦优质运输网络的澳洲悉尼墨尔本家具及大型物品海运公司盘点
  • LGP7963 [NOIP 2021] 棋局 学习笔记
  • 310、清平调三首其三
  • 2025 年国内地坪源头厂商最新推荐排行榜:聚焦优质企业服务与性能,助力客户精准选型固化剂/水性聚氨酯砂浆/环氧/聚氨酯超耐磨地坪工程厂商推荐
  • 2025 最新国际搬家公司推荐榜:海运 / 移民 / 家具运输实测解析,靠谱服务商甄选指南
  • 2025 年数据恢复系统公司推荐转转大师数据恢复,深度剖析各款系统平台核心优势与适用场景数据恢复系统推荐指南
  • 2025 年最新推荐防静电地板源头厂家权威排行榜,涵盖机房陶瓷全钢等多类型产品优质品牌汇总车间/生产防静电地板/防静电活动地板/抗静电地板公司推荐
  • 秋假集训记
  • golang优化
  • AI智能体开发!和Kiro、Kimi、PPIO、TEN、memU、MiniMax一起Vibe丨Convo AIRTE2025
  • 实用指南:Transformer模型:深度解析自然语言处理的革命性架构
  • 第一章
  • 生成式AI基础设施面临网络攻击威胁:企业安全新挑战
  • 数据结构笔记
  • 实用指南:SQL Server从入门到项目实践(超值版)读书笔记 27
  • VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 H3C 新华三 定制版
  • LGP8866 [NOIP 2022] 喵了个喵 学习笔记
  • edge每次打开不是用自己的账户,还要选择一次
  • LibreOffice Impress播放不出视频的解决方法