您的位置:首页 > 其它

NOIPTG A组总结&T2题解

2016-07-20 15:11 295 查看
这是个惨烈的日子,让我贴一贴成绩。



嗯。这就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等我去瞧一瞧。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  总结-题解