三值逻辑:有点坑并且细节较繁琐,但有点板子的并查集。

修改操作

发现对于每个点,只有对他的最后一次操作才是有用的,所以记录下最终的祖先即可。

然而这里并不能用并查集来实现,因为并查集它具有的是传递性,无论你路不路径压缩,每次修改一个父节点时它的子节点一定会被修改,所以我们不能使用并查集。

但是可以使用并查集相关思想。

首先我们建立虚拟源点 \(n+1\) 表示 \(T\),\(n+2\) 表示 \(U\)。到某个点的距离为奇数时表示与这个点的值相反,为偶数则表示与这个点的值相等。

每次修改后,我们都直接指向父节点的祖先节点。为啥祖先节点就可以呢?因为此时祖先节点是未被修改的,而根据题目中“使得每个变量初始值与最终值相同”,所以这里跟祖先节点连边相当于和祖先节点的初值连边。自然是正确的了。

upd:这里其实可以用并查集,但是要时时刻刻路径压缩,每 combine 一次就要压一次。

注意,本题的先后问题主要还是通过路径压缩到祖先节点而不是父节点来解决的。

判断合法性

对于直接连向 \(U\) 的连通块,最终的结果一定是 \(U\)。

其余如果出现矛盾的连通块,最终的结果也一定全部是 \(U\)。这个的实现,只需要每次合并的时候判断一下到祖先节点的距离就好了。

时间复杂度 \(O(tn)\)。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,m,tof[100005],tod[100005],f[100005],d[100005];
//n+1: T ,n+2: U
bitset<100005>ilg;
int findf(int x)
{
if(f[x]!=x)
{
int orif=f[x];
f[x]=findf(f[x]);
d[x]=(d[orif]^d[x]);
}
return f[x];
}
void combine(int x,int y,int td)
{
int fx=findf(x),fy=findf(y);
if(fx!=fy)
{
d[fx]=(d[y]^td^d[x]);
f[fx]=fy;
}
}
void init()
{
for(int i=1;i<=n+2;i++)f[i]=i,d[i]=0;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n+2;i++)
{
tof[i]=i;
tod[i]=0;
}
ilg.reset();
for(int i=1;i<=m;i++)
{
int a,b;
char v;
cin>>v>>a;
if(v=='+')
{
cin>>b;
tof[a]=tof[b];
tod[a]=tod[b];
}
else if(v=='-')
{
cin>>b;
tof[a]=tof[b];
tod[a]=(tod[b]^1);
}
else if(v=='T')
{
tof[a]=n+1;
tod[a]=0;
}
else if(v=='F')
{
tof[a]=n+1;
tod[a]=1;
}
else
{
tof[a]=n+2;
tod[a]=0;
}
}
init();
for(int i=1;i<=n;i++)
{
if(findf(i)==findf(tof[i]))
{
if(tod[i]!=(d[i]^d[tof[i]]))ilg[findf(i)]=1;
}
combine(i,tof[i],tod[i]);
}
int ans=0;
for(int i=1;i<=n;i++)if(findf(i)==n+2||ilg[findf(i)])ans++;
cout<<ans<<'\n';
}
int main()
{
//freopen("tribool.in","r",stdin);
//freopen("tribool.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int x,t;
cin>>x>>t;
while(t--)solve();
return 0;
}

Luogu P9869 NOIp2023 三值逻辑 题解 [ 绿 ] [ 带权并查集 ]的更多相关文章

  1. Codeforces Round #181 (Div. 2) B. Coach 带权并查集

    B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...

  2. bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...

  3. Bzoj1202/洛谷P2294 [HNOI2005]狡猾的商人(带权并查集/差分约束系统)

    题面 Bzoj 洛谷 题解 考虑带权并查集,设\(f[i]\)表示\(i\)的父亲(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]} ...

  4. 【bzoj3376-方块游戏】带权并查集

    题意: n块积木,m个操作或询问.每次移动积木的时候,约翰会选择两块积木X,Y,把X搬到Y的上方.如果X已经和其它积木叠在一起了,那么应将这叠积木整体移动到Y的上方:如果Y已经和其它积木叠在一起了的, ...

  5. 并查集——poj2236(带权并查集)

    题目:Wireless Network 题意:给定n台已损坏计算机的位置和计算机最远通信距离d,然后分别根据命令执行以下两种操作: "O p" (1 <= p <= N ...

  6. A Bug's Life POJ - 2492 (带权并查集)

    A Bug's Life POJ - 2492 Background Professor Hopper is researching the sexual behavior of a rare spe ...

  7. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  8. luogu 1196 银河英雄传说 带权并查集

    带权并查集,其实有点像许多队列问情况的小学奥数 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<= ...

  9. luogu 2294 狡猾的商人 带权并查集

    此题做法多啊 带权并查集,区间dp,前缀和,差分约束 1.自己写的前缀和, 11 #include<bits/stdc++.h> #define rep(i,x,y) for(regist ...

  10. NOI2002银河英雄传说-带权并查集

    [NOI2002]银河英雄传说-带权并查集 luogu P1196 题目描述 Description: 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年, ...

随机推荐

  1. getent使用小结

    转载请注明出处: getent 是一个用于访问系统数据库的命令,通常用于获取与网络有关的信息,比如用户.组.主机名.服务等.这个命令是 Linux 和 Unix 系统中非常有用的工具,可以用来查询多种 ...

  2. sort函数详解

    sort函数 简介 其实STL中的sort()并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序.根据不同的数量级别以及不同情况,能自动选用合适的排序方法.当数据量较大时 ...

  3. mysqldump+binlog备份脚本

    mysqldump是一种逻辑备份工具 , 可以对数据库进行全量备份 , 和binlog增量备份共同使用可以进行数据库备份 , 基于此写了一个备份的脚本 #!/bin/bash all_path=&qu ...

  4. 重磅推出 Sdcb Chats:一个全新的开源大语言模型前端

    重磅推出 Sdcb Chats:一个全新的开源大语言模型前端 在当前大语言模型(LLM)蓬勃发展的时代,各类 LLM 前端层出不穷.那么,为什么我们还需要另一个 LLM 前端呢? 最初的原因在于质感的 ...

  5. Flutter Stream的使用

    Flutter Stream的使用 首先,来了解一下stream是什么 异步数据事件的来源. 流提供了一种接收一系列事件的方法.每个事件要么是一个数据事件,也称为流的元素,要么是一个错误 事件,即某事 ...

  6. .NET 6 探索 Minimal API 系列

    今天看到来自 https://www.dotnetdeveloper.cn/ 的一个 .NET 6 Minimal API 系列,感觉质量不错,特别收录在这里. .Net 6探索 (1) Minima ...

  7. 查看MySQL数据库所有的表名、表注释、字段名称、类型、长度、备注,一键导出生成数据库字典

    一.先了解下INFORMATION_SCHEMA1.在MySQL中,把INFORMATION_SCHEMA看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信 ...

  8. Qt编写视频监控系统70-OSD标签和图形信息(支持写入到文件)

    一.前言 作为一个完整的视频监控系统,用户还需要自定义一些OSD标签信息显示在对应通道上面,而且不止一个OSD标签信息,位置可以在四个角或者指定坐标显示.最开始本系统设计的时候,由于本人擅长的是pai ...

  9. [转]ptp(precision time protocol)时钟同步

    一.介绍1:什么是ptpPTP(Precision Time Protocol) 是一个通过网络同步时钟的一个协议.当硬件支持时,PTP 精度能达到亚微秒,比 NTP(Network Time Pro ...

  10. IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf

    本文由sweetying分享,为了更好的阅读体验,有较多的内容修订和排版优化. 1.前言 最近我负责的 LiveChat 客服聊天系统到了自研阶段,任务类似于做一个腾讯云IM这样的通信层SDK.在和后 ...