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

三值逻辑

我认为是一道好题。

以下内容参考了 @Svemit 的题解

首先题目可以抽象成图论问题,我们记 \(\lnot x\)\(-x\),但是因为实际上不能用负下标,我们在实现中用 \(n + x\) 代替(类似分层图),另外,我们让 \(T,F,U\) 分别代表一些常量,由于 \(-U = U\),故令 \(U = 0\)\(T,F\) 不重要,互为相反数且不为 \(0\) 即可。

则对于每个数 \(x\),有两种状态:

1.\(x\) 最终被赋值了,记值为 \(val_x\).

2.\(x\) 指向某个数,即 \(x\) 会随某个数的改变而改变,我们记这个数为 \(p_x\),但是 \(x\) 也可能为 \(-p_x\),所以我们要记一个 \(sgn_x\) 表示 \(x = sgn_x \times p_x\),即 \(x\) 最终为 \(p_x\) 还是 \(-p_x\). 当然既然是图论问题,也存在 \(x\) 最终指向自己的问题,这时出现了一个环,环上所有点都是相同的,\(x\) 是什么它们就是什么.

上述信息很明显可以并查集维护。

接下来我们来看看什么情况会出现必须选 \(U\) 的情况,同样是两种:

1.\(val_x = U\),那么 \(x\) 和所有指向 \(x\) 的点必须是 \(U\).

2.并查集中 \(x\)\(-x\) 所在集合相同,即 \(x\)\(-x\) 指向相同,那么这个集合也得是 \(U\).

知道了这些,就可以算答案了.

时间复杂度 \(\mathcal{O}(Tn\alpha(n))\)

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, mod = 998244353, inf = 1 << 30, T = 1, F = -1, U = 0;
typedef long long ll;
typedef pair<int, int> pii;
void cmax(int &x, int y) { if (x < y) x = y; }
void cmin(int &x, int y) { if (x > y) x = y; } 
void add(int &x, int y) { x += y; if (x >= mod) x -= mod; }
void mul(int &x, int y) { x = 1ll * x * y % mod; }
template<typename T>
void dbg(const T &t) { cerr << t << endl; }
template<typename Type, typename... Types>
void dbg(const Type& arg, const Types&... args) {#ifdef ONLINE_JUDGEreturn ;#endifcerr << arg << ' ';dbg(args...);
}   
int c, Tc, n, m, fa[N], sz[N], val[N], p[N], sgn[N], ans; //x 最终会随着 p[x] 的改变而改变, val[x] = sgn[x] * val[p[x]]
map<char, int>mp = {{'T', T}, {'F', F}, {'U', U}};
int find(int pos) { return pos == fa[pos] ? pos : fa[pos] = find(fa[pos]); }
void merge(int x, int y) {x = find(x), y = find(y);if (x == y) return ;fa[x] = y, sz[y] += sz[x];
}
void update(int x) {x = find(x);ans += sz[x];sz[x] = 0;
}
int main() {ios::sync_with_stdio(false); cin.tie(nullptr);cin >> c >> Tc;while (Tc--) {ans = 0;cin >> n >> m;for (int i = 1; i <= n; i++) p[i] = i, sgn[i] = 1, val[i] = inf;for (int i = 1; i <= (n << 1); i++) fa[i] = i, sz[i] = (i <= n);while (m--) {char op;int a, b;cin >> op;if (op == '+' || op == '-') {cin >> a >> b;if (op == '+') {if (val[b] != inf) {val[a] = val[b];} else {val[a] = inf;p[a] = p[b];sgn[a] = sgn[b];}} else {if (val[b] != inf) {val[a] = -val[b];} else {val[a] = inf;p[a] = p[b];sgn[a] = -sgn[b];}}} else {cin >> a;val[a] = mp[op];}}for (int i = 1; i <= n; i++) if (val[i] == inf) {int x = p[i];if (sgn[i] == 1) {merge(i, x), merge(i + n, x + n);} else {merge(i + n, x), merge(i, x + n);}} //并查集for (int i = 1; i <= n; i++) {if (val[i] == U) {update(i), update(i + n);} else if (find(i) == find(i + n)) {update(i);}} // 算答案(注意算完一个后要清空,因为一个集合可能有多个 x 和 -x 同时存在,但只能算一次)cout << ans << '\n';}return 0;
}
http://www.gsyq.cn/news/116288.html

相关文章:

  • 2025年四川臭虫防治服务渠道权威推荐榜单:成都臭虫灭治服务/四川上门除臭虫公司/四川臭虫治理供应商精选 - 品牌推荐官
  • 为什么你的数据治理效果难固化?关键在这2个核心动作
  • 合同管理软件选型:五款主流平台功能与场景适配分析 - 品牌排行榜
  • 【企业级Docker更新实战指南】:Agent服务无缝升级的5大黄金步骤
  • 2025干洗店加盟优质品牌推荐榜-低风险高支持创业指南 - 资讯焦点
  • AMD 780M APU性能大爆发:ROCm优化库深度配置指南
  • 深入解析:3步解决iOS数据库灾难:GRDB.swift文件修复全指南
  • 2025年移动悬臂吊机定制厂家权威推荐榜单:克令吊机/小型船用吊机/港口码头移动吊机制造商精选 - 品牌推荐官
  • 鸿蒙远程真机终极指南:HOScrcpy让调试变得像玩游戏一样简单
  • 不只是朗读:EmotiVoice让机器学会‘有感情地说话’
  • 【爆】从多模态到全模态:AI大模型革命性进化,编程小白也能看懂的AGI实现路径
  • pytorch nn.Parameter self.register_parameter() 区别
  • 淘宝扭蛋机小程序:开启线上娱乐与购物的全新融合时代
  • 量子电路设计必知的7大导出格式(专家级可视化指南)
  • ComfyUI-MultiGPU:突破显存限制的分布式计算终极解决方案
  • 【运维自动化-标准运维】如何创建条件分支流程
  • 告别手写布局:Tkinter可视化拖拽工具如何让Python GUI开发提速10倍
  • 2025年长沙口腔医院 / 门诊怎么选?5 家权威机构实测推荐,性价比 + 诊疗效果双优 - 博客万
  • JavaScript DOM 原生部分(五):事件绑定
  • 30分钟速成!本地部署大模型全攻略:从零开始打造自定义AI助手!
  • 【2025护网】面试及经验分享(非常详细),零基础入门到精通,看这一篇就够了
  • 【专家亲授】VSCode连接Azure QDK失败的7种应对策略:从报错日志到秒级修复
  • 量子程序调试进入新时代:VSCode集成环境全面解析
  • 市值超3100亿,沐曦科技上市让经纬创投爆赚136亿
  • LangChain Agent开发概述
  • 别再裸奔了!智能 Agent 的 Docker 安全配置必须包含这 8 个核心项
  • stm32毕业论文(毕设)必过选题怎么选
  • 风能太阳能供电的路灯智能控制系统(论文+源码)
  • Apple Silicon芯片如何突破架构限制运行Vivado?Docker容器方案深度解析
  • 2026破局:以营销自动化成熟度Macom模型为鞍,驰骋增长新赛道!