jzoj P3796 議案決定

2021-08-15 10:04:33 字數 2927 閱讀 5458

國王手下有m個大臣,他們有一天對國王要處理的n件事務進行投票。每個大臣可以對兩件事務贊成或反對,格式如下:x c_x y c_y表示這個大臣對事務x的態度為c_x,對事務y的態度為c_y。如果國王的決定和某個大臣的兩個意見都不同,那麼這個大臣就會離開國王。小c認為不能讓任何乙個大臣離開國王,否則國王就無法正常地處理自己的事務。請你幫助小c做個決定。

如果小c無論如何都只能讓至少乙個大臣離開國王,則輸出「impossible」(不含雙引號),否則輸出乙個長度為n的字串,如果第i件事務必須贊成,則第i個字元為「y」;如果第i件事務必須反對,則第i個字元為「n」,否則第i個字元為「?」。

x, y為整數,c_x, c_y為「y」(表示贊成)或「n」(表示反對)

對於50%的資料,1<=n<=10,1<=m<=40;

對於全部的資料,1<=n<=1000,1<=m<=4000。

這題一開始並沒有什麼想法,各種暴力都套不進。。。

後來看了幾篇部落格,才知道其實很簡單

對於一對[x,cx,y,cy]而言,你要使得大臣不離開至少要有乙個滿足

則, 舉例一種情況:

1 y 2 y

這時候,你要留下大臣,就要滿足1 y 或者 2 y

我們可以這樣理解

對1是n時對2必定要是y

對2是n時對1必定要是y

這時候其他的同理

我們就可以將這些關係建成一條條邊

然後列舉每乙個事務的y/n 兩種狀態,沿著邊跑,

判斷是否當你對i持y意見時,你是否必定必須要對i持n意見!

就是你i選了y以後那些邊對應的意見就要相對應的做出選擇,看這些選擇時候能使得事務i必定出現n

你對i持n意見時,同理

但2個意見都沒衝突時,輸出?

y沒n有,輸出y

n沒y有,輸出n

都有衝突,哇!impossible

這或許就是傳說中的2-sat

const

maxn=4001;

var a:array[0..maxn,1..2] of longint;

go,next:array [0..2*maxn] of longint;

cp,list:array [0..2001] of longint;

n,m,i,j,rp,p,q:longint;

check,rp1,rp2:boolean;

ans:ansistring;

x1,x2:char;

procedure

add(x,y:longint);

begin

inc(p);

go[p]:=y;

next[p]:=list[x];

list[x]:=p;

end;

procedure

work

(x:longint);

var i:longint;

begin

ifnot(rp1) then

exit;

if x=rp then

begin

rp1:=false;

exit;

end;

cp[x]:=q;

i:=list[x];

while i>0

dobegin

if cp[go[i]]<>q then work(go[i]);

ifnot(rp1) then

exit;

i:=next[i];

end;

end;

begin

readln(n,m);

for i:=1

to m do

begin

readln(a[i,1],x1,x1,a[i,2],x2,x2);

if (x1='y') and (x2='n') then

begin

add(a[i,1]+n,a[i,2]+n);

add(a[i,2],a[i,1]);

end;

if (x1='y') and (x2='y') then

begin

add(a[i,1]+n,a[i,2]);

add(a[i,2]+n,a[i,1]);

end;

if (x1='n') and (x2='y') then

begin

add(a[i,1],a[i,2]);

add(a[i,2]+n,a[i,1]+n);

end;

if (x1='n') and (x2='n') then

begin

add(a[i,1],a[i,2]+n);

add(a[i,2],a[i,1]+n);

end;

end;

fillchar(cp,sizeof(cp),0);

ans:='';

q:=0;

for i:=1

to n do

begin

inc(q);

rp1:=true;

rp:=n+i;

work(i);

rp2:=rp1;

inc(q);

rp1:=true;

rp:=i;

work(n+i);

ifnot(rp1) and

not(rp2)

then

begin

writeln('impossible');

halt;

end;

if (rp1) and (rp2) then ans:=ans+'?'

else

if rp2 then ans:=ans+'y'

else ans:=ans+'n';

end;

writeln(ans);

end.

379 完全平方數 BFS

給定正整數 n,找到若干個完全平方數 比如 1,4,9,16,使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12 輸出 3 解釋 12 4 4 4.示例 2 輸入 n 13 輸出 2 解釋 13 4 9.from collections import deque b...

火影忍者379話最新情報

火影忍者379話情報 從漫畫一開始,佩因的一句話就讓人驚奇。從管子逃走了麼?上一話自來也就得出結論,佩印的視覺只是共享,並沒有具備像白眼一樣近乎360度視角的能力,火影忍者379情報 火影忍者379情報圖 火影忍者379話 火影忍者第379話 但是當時三個人都是背對管子的,怎麼會知道自來也是從管子逃...

jzoj P1330 迎接儀式

給出乙個不和諧的佇列,用 j 替代 教 z 替代 主 而乙個 j 與 z 組成的序列則可以描述當前的佇列。為了讓教主看得盡量舒服,你必須調整佇列,使得 jz 子串盡量多。每次調整你可以交換任意位置上的兩個人,也就是序列中任意位置上的兩個字母。而因為教主馬上就來了,時間僅夠最多作k次調整 當然可以調整...