NOIPTG A组总结&T2题解

来源:互联网 发布:linux怎么看网关 编辑:程序博客网 时间:2024/06/05 19:11

这是个惨烈的日子,让我贴一贴成绩。
这里写图片描述
嗯。这就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等我去瞧一瞧。。

0 0
原创粉丝点击