【CF766D】Mahmoud and a Dictionary(并查集)

题意:有n个单词,给定m个关系,每个关系要么表示单词a与单词b相同,要么表示单词a与单词b相反。

并且“相同”与“相反”有性质:若a与b相同,b与c相同,则a与c相同(从而单词的相同关系是等价关系);

若a与b相反,b与c相反,则a与c相同。按顺序判断这m个关系是否可以成立,若可以成立,则加上这个关系,否则忽略。

再给定q个询问,每个询问 查询单词a与单词b的关系(相同、相反或未知)。

n,m,q<=10^5

思路:并查集

设与i相反的单词集合中的代表为fan[i],则x与y相同的条件是:find(fan[x])<>find(y),合并(find(x),find(y)),(find(fan[x]),find(fan[y]))

不同:find(x)<>find(y),合并时类似

询问类似

  1 var a:array[1..110000]of string;
  2     fa,fan:array[1..200000]of longint;
  3     n,m,k,i,x,y,s,que,j,t1,t2,x1,y1,x2,y2:longint;
  4     tmp,mid,t,ch:ansistring;
  5
  6 procedure swap(var x,y:string);
  7 begin
  8  t:=x; x:=y; y:=t;
  9 end;
 10
 11 procedure qsort(l,r:longint);
 12 var i,j,t:longint;
 13 begin
 14  i:=l; j:=r; mid:=a[(l+r)>>1];
 15  repeat
 16   while mid>a[i] do inc(i);
 17   while mid<a[j] do dec(j);
 18   if i<=j then
 19   begin
 20    swap(a[i],a[j]);
 21    inc(i); dec(j);
 22   end;
 23  until i>j;
 24  if l<j then qsort(l,j);
 25  if i<r then qsort(i,r);
 26 end;
 27
 28 function hash(x:string):longint;
 29 var l,r,mid:longint;
 30 begin
 31  l:=1; r:=n;
 32  while l<=r do
 33  begin
 34   mid:=(l+r)>>1;
 35   if a[mid]=x then exit(mid)
 36    else if a[mid]<x then l:=mid+1
 37     else r:=mid-1;
 38  end;
 39 end;
 40
 41 function find(k:longint):longint;
 42 begin
 43  if k=0 then exit(0);
 44  if fa[k]<>k then fa[k]:=find(fa[k]);
 45  exit(fa[k]);
 46 end;
 47
 48 procedure union(x,y:longint);
 49 var p,q:longint;
 50 begin
 51  if (x=0)or(y=0) then exit;
 52  p:=find(x); q:=find(y);
 53  if p<>q then fa[p]:=q;
 54 end;
 55
 56 begin
 57 // assign(input,‘cf766d.in‘); reset(input);
 58  //assign(output,‘cf766d.out‘); rewrite(output);
 59  readln(n,m,que);
 60  readln(ch);
 61  k:=length(ch);
 62  s:=0;
 63  for j:=1 to k do
 64  begin
 65   if ch[j]=‘ ‘ then begin inc(s); a[s]:=tmp; tmp:=‘‘; continue; end;
 66    tmp:=tmp+ch[j];
 67  end;
 68  inc(s); a[s]:=tmp;
 69
 70  qsort(1,n);
 71  for i:=1 to n do
 72  begin
 73   fan[i]:=0; fa[i]:=i;
 74  end;
 75  for i:=1 to m do
 76  begin
 77   readln(ch); tmp:=‘‘; s:=0;
 78   k:=length(ch);
 79   for j:=2 to k do
 80   begin
 81    if ch[j]=‘ ‘ then
 82    begin
 83     inc(s);
 84     if s=2 then x:=hash(tmp);
 85     tmp:=‘‘;
 86     continue;
 87    end;
 88    if (ch[j]>=‘a‘)and(ch[j]<=‘z‘) then tmp:=tmp+ch[j];
 89   end;
 90   y:=hash(tmp);
 91   x1:=find(x); y1:=find(y);
 92   x2:=find(fan[x1]); y2:=find(fan[y1]);
 93   case ch[1] of
 94    ‘1‘:
 95    begin
 96     if x2=y1 then writeln(‘NO‘)
 97      else
 98      begin
 99       writeln(‘YES‘);
100       union(x1,y1);
101       union(x2,y2);
102       if y2=0 then fan[y1]:=x2;
103      end;
104    end;
105    ‘2‘:
106    begin
107     if x1=y1 then writeln(‘NO‘)
108      else
109      begin
110       writeln(‘YES‘);
111       if x2>0 then union(y1,x2)
112        else fan[x1]:=y1;
113       if y2>0 then union(x1,y2)
114        else fan[y1]:=x1;
115      end;
116    end;
117   end;
118  end;
119  for i:=1 to que do
120  begin
121   readln(ch); tmp:=‘‘; s:=0;
122   k:=length(ch);
123   for j:=1 to k do
124   begin
125    if ch[j]=‘ ‘ then
126    begin
127     inc(s);
128     if s=1 then x:=hash(tmp);
129     tmp:=‘‘;
130     continue;
131    end;
132    if (ch[j]>=‘a‘)and(ch[j]<=‘z‘) then tmp:=tmp+ch[j];
133   end;
134   y:=hash(tmp);
135   x1:=find(x); y1:=find(y);
136   x2:=find(fan[x1]); y2:=find(fan[y1]);
137   if x1=y1 then writeln(1)
138    else if (x1=y2)or(x2=y1) then writeln(2)
139     else writeln(3);
140  end;
141  //close(input);
142  //close(output);
143 end.
时间: 2024-10-12 18:35:54

【CF766D】Mahmoud and a Dictionary(并查集)的相关文章

CF766D Mahmoud and a Dictionary

题面:https://www.luogu.org/problemnew/show/CF766D 本题现将字符串转化为两个元素之间的关系,之后再利用带权并查集的操作进行路径压缩和判断即可,注意这里的种类数为2. Code: #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int fa[N],rnk[N]; map<string,int>ma; void Init(int n) { for(int i=0;

Codeforces Round #396 (Div. 2) D题Mahmoud and a Dictionary(并查集)解题报告

Mahmoud wants to write a new dictionary that contains n words and relations between them. There are two types of relations: synonymy (i. e. the two words mean the same) and antonymy (i. e. the two words mean the opposite). From time to time he discov

codeforces#766 D. Mahmoud and a Dictionary (并查集)

题意:给出n个单词,m条关系,q个询问,每个对应关系有,a和b是同义词,a和b是反义词,如果对应关系无法成立就输出no,并且忽视这个关系,如果可以成立则加入这个约束,并且输出yes.每次询问两个单词的关系,1,同义词,2,反义词,3,不确定 题解:这题思路比较奇特,开辟2*n的并查集的空间,第i+n代表i的反义词所在的树,初始为i+n,也就是说i+n代表i的反义词 #include<bits/stdc++.h> using namespace std; #define ll long long

Mahmoud and a Dictionary

Mahmoud and a Dictionary 题目链接:http://codeforces.com/problemset/problem/766/D 并查集 这种涉及到元素的关系的题目自然就想到了并查集. 我们给每个元素设定两个属性值:pre(前驱结点)和rela(与前驱结点的关系),其中, 当rela=0时,表示当前结点x与其前驱结点a[x].pre是同义词: 当rela=1时,表示当前结点x与其前驱结点a[x].pre是反义词. 由于同义词的同义词是同义词,反义词的反义词是同义词,词与词

Catenyms+欧拉回路/欧拉路+并查集+POJ

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9617   Accepted: 2524 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For e

经典算法题每日演练——第十五题 并查集

原文:经典算法题每日演练--第十五题 并查集 这一篇我们看看经典又神奇的并查集,顾名思义就是并起来查,可用于处理一些不相交集合的秒杀. 一:场景 有时候我们会遇到这样的场景,比如:M={1,4,6,8},N={2,4,5,7},我的需求就是判断{1,2}是否属于同一个集合,当然实现方法 有很多,一般情况下,普通青年会做出O(MN)的复杂度,那么有没有更轻量级的复杂度呢?嘿嘿,并查集就是用来解决这个问题的. 二:操作 从名字可以出来,并查集其实只有两种操作,并(Union)和查(Find),并查集

CodeForces 745C Hongcow Builds A Nation 并查集

题意: 给了你n个城市 m条边 k个政府 每个政府管辖的区域内不能和其他政府的区域有相连 即政府之间不存在路径 问你在维护这种关系的同时 最多再加多少条边 思路: 先找出来每个联通块 再找出来没有归属的孤立的点 把他们都放到最大的联通块里 然后每个联通块之间的点两两连边是n*(n-1)/2条边 最后算出来的ans-m就好了 (看别人的博客学了一个max_element 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a

并查集(个人模版)

并查集: 1 int find(int a) 2 { 3 int r=a; 4 while(f[r]!=r) 5 r=f[r]; 6 int i=a; 7 int j; 8 while(i!=r) 9 { 10 j=f[i]; 11 f[i]=r; 12 i=j; 13 } 14 return r; 15 } 16 int merge(int a,int b) 17 { 18 int A,B; 19 A=find(a); 20 B=find(b); 21 if(A!=B) 22 { 23 f[B

并查集应用

题目描述: One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls