NOIPTG A組總結 T2題解

2021-07-15 06:56:39 字數 2997 閱讀 8068

這是個慘烈的日子,讓我貼一貼成績。

嗯。這就tm很尷尬了。話說我二十分還能拿個rank4。。醉了

t1 world tour cf666b&667d

題意:給你一些單向邊,讓你求出四個點,使得經過這四個點的路徑盡可能的長(兩點之間走最短路徑,四個點不能重複,但是經過路徑可以)

直接暴力spfa求出最遠的兩個點,然後以這兩個點向外暴力求另外兩個,即:

a,b,?,?

?,?,a,b

?,a,b,?

三種情況。。

然而答案不唯一,卻沒有spj,這tm就很尷尬了。

暴力能拿最高分(其實暴力也是會求解出多種情況的吧,為什麼暴力得分就能全部拿到呢?…並不知道)。

t2 graph coloring cf662b

有一些邊(無向),和一些點,不保證聯通,但是每一條邊有兩種顏色,紅或藍,每一次操作乙個點,把所有和這個點相連的路徑的顏色全部翻轉(紅變藍,藍變紅)求最小的操作次數使得整個圖變為同一種顏色。。

比賽的時候想到用並查集維護然後dfs但是沒有時間打了(都花在第一題上)。後來下來才發現題解思路有些相似。。

每乙個點最多改變一次,因為改變兩次等於沒有變化。改變3次等於改變一次。

那麼答案有兩種可能,全部為紅色或者藍色。所以設兩個目標狀態去求。

然後我們可以發現,在乙個連通分量裡,只要第乙個點(第一不是編號,其實隨意哪乙個都可以)的狀態確定,剩餘點的狀態都可以根據這個點的狀態推出,所以我們就把每乙個連通分量裡的第乙個點設兩個狀態,然後分別求出整個連通分量的答案,取小的那乙個加入最後的答案裡。

然後把目標狀態設為紅藍分別求兩次,求出最小的那個就是答案。

**:uses math;

var

n,m,k,p,tot,num,num1,ans:int64;

i,j:longint;

s:char;

go,len,next,head,bz:array[0..200000]of longint;

a,b,col:array[0..100000]of longint;

procedure add(x,y,z:longint);

begin

inc(tot);

go[tot]:=y;

len[tot]:=z;

next[tot]:=head[x];

head[x]:=tot;

end;

procedure dfs(t:longint);

var

i,x:longint;

begin

inc(ans,bz[t]);

i:=head[t];

while i<>0 do

begin

x:=bz[t] xor len[i];

if bz[go[i]]=-1 then

begin

bz[go[i]]:=x;

dfs(go[i]);

end

else if x<>bz[go[i]] then ans:=maxlongint;

i:=next[i];

end;

end;

procedure fill(t:longint);

var

i:longint;

begin

i:=head[t];

bz[t]:=-1;

while i<>0 do

begin

if bz[go[i]]<>-1 then fill(go[i]);

i:=next[i];

end;

end;

procedure solve(n,j:longint);

var

i:longint;

ans1:int64;

begin

for i:=1 to n do bz[i]:=-1;

for i:=1 to m do

if (col[i]=1)and(bz[a[i]]=-1) then

begin

ans:=0;

bz[a[i]]:=1;

dfs(a[i]);

ans1:=ans;

ans:=0;

fill(a[i]);

bz[b[i]]:=1;

bz[a[i]]:=-1;

dfs(b[i]);

inc(num,min(ans1,ans));

end;

end;

procedure qufan(var x:longint);

begin

x:=1-x;

end;

begin

readln(n,m);

for i:=1 to m do

begin

read(a[i],b[i]);

read(s);

readln(s);

if s='b' then col[i]:=1 else col[i]:=0;

add(a[i],b[i],col[i]);

add(b[i],a[i],col[i]);

end;

solve(n,1);

num1:=num;

num:=0;

for i:=1 to tot do qufan(len[i]);

for i:=1 to m do qufan(col[i]);

solve(n,2);

num:=min(num1,num);

if num=maxlongint then writeln(-1)else

writeln(num);

end.

t3等我去瞧一瞧。。

T2 監考老師 題解

第二題,他並不是多難的演算法。甚至連搜尋都不用,他的題目要求和資料斷定了他第二題的地位。在乙個大試場裡,有 n 行 m 列的考生,小王和眾多同學正在考試,這時,有一部分考生 作弊,當然,監考老師能發現他們。但是只有乙個監考老師,他由於高度近視,只能發現與 他同行同列的作弊者,而且由於監考老師年老體弱...

2019 05 25 模擬 A 組 T2 數格仔

暴搜搜出前面幾個的答案 然後列舉每一項的係數再列舉乙個常數項推出規律 規律 fn fn 1 5 f n 2 fn 3 fn 4 f n f 5 times f f f fn fn 1 5 fn 2 fn 3 fn 4 然後將搜尋出來的前四項帶入 矩陣乘法優化 include include incl...

NOIP2012普及組T2 尋寶

傳說很遙遠的藏寶樓頂層藏著誘人的寶藏。小明歷盡千辛萬苦終於找到傳說中的這個藏寶樓,藏寶樓的門口豎著乙個木板,上面寫有幾個大字 尋寶說明書。說明書的內容如下 藏寶樓共有 n 1 層,最上面一層是頂層,頂層有乙個房間裡面藏著寶藏。除了頂層外,藏寶樓另有 n 層,每層 m 個房間,這 m 個房間圍成一圈並...