1 条题解
-
0
自动搬运
来自洛谷,原作者为

wcy110614
lichess : wangcy 笨蛋。搬运于
2025-08-24 23:00:46,当前版本为作者最后更新于2024-07-10 15:52:54,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
前置知识:并查集。
虽然这道题并不算太难,但是没见过这个套路还是有难度的。
考虑将每个点加一个对应的虚点,比如 表示 的所带的电荷和 相反。
-
如果 互相吸引,那么 所对应的集合相反,则 连边。
-
如果 互相排斥,说明 所在的集合相同,则 连边。
-
分类讨论判断 所在的集合。如果 之间有边, 就会有相同电荷,排斥。如果 之间有边, 就会有不同电荷,吸引。如果这两条边都没有,那就完全得不到任何关系,这个时候输出
?。
#include <bits/stdc++.h> #define ll long long using namespace std; const int N=2e5+10; int n,m,f[N]; int gf(int x){return x==f[x]?f[x]:f[x]=gf(f[x]);} void link(int x,int y){ int u=gf(x),v=gf(y); f[u]=v; } int main(){ for(int i=1;i<N;++i)f[i]=i; cin>>n>>m; while(m--){ char op;int a,b; cin>>op>>a>>b; if(op=='A')link(a,b+n),link(a+n,b); else if(op=='R')link(a,b),link(a+n,b+n); else{ int fl=0; if(gf(a)==gf(b)||gf(a+n)==gf(b+n))cout<<'R'; else if(gf(a+n)==gf(b)||gf(a)==gf(b+n))cout<<'A'; else cout<<'?'; cout<<"\n"; } } return 0; } -
- 1
信息
- ID
- 10517
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者