NOIPTG A组总结&T2题解
2016-07-20 15:11
295 查看
这是个惨烈的日子,让我贴一贴成绩。
![](https://img-blog.csdn.net/20160720145511225)
嗯。这就tm很尴尬了。话说我二十分还能拿个rank4。。醉了
T1 World Tour CF666B&667D
题意:给你一些单向边,让你求出四个点,使得经过这四个点的路径尽可能的长(两点之间走最短路径,四个点不能重复,但是经过路径可以)
直接暴力spfa求出最远的两个点,然后以这两个点向外暴力求另外两个,即:
a,b,?,?
?,?,a,b
?,a,b,?
三种情况。。
然而答案不唯一,却没有spj,这tm就很尴尬了。
暴力能拿最高分(其实暴力也是会求解出多种情况的吧,为什么暴力得分就能全部拿到呢?…并不知道)。
T2 graph coloring CF662B
有一些边(无向),和一些点,不保证联通,但是每一条边有两种颜色,红或蓝,每一次操作一个点,把所有和这个点相连的路径的颜色全部翻转(红变蓝,蓝变红)求最小的操作次数使得整个图变为同一种颜色。。
比赛的时候想到用并查集维护然后dfs但是没有时间打了(都花在第一题上)。后来下来才发现题解思路有些相似。。
每一个点最多改变一次,因为改变两次等于没有变化。改变3次等于改变一次。
那么答案有两种可能,全部为红色或者蓝色。所以设两个目标状态去求。
然后我们可以发现,在一个连通分量里,只要第一个点(第一不是编号,其实随意哪一个都可以)的状态确定,剩余点的状态都可以根据这个点的状态推出,所以我们就把每一个连通分量里的第一个点设两个状态,然后分别求出整个连通分量的答案,取小的那一个加入最后的答案里。
然后把目标状态设为红蓝分别求两次,求出最小的那个就是答案。
代码:
T3等我去瞧一瞧。。
嗯。这就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等我去瞧一瞧。。
相关文章推荐
- C# 数组拆分
- 盛水最大量---贪心算法
- mysql 编译参数详解
- Javascript 基础之Number对象
- 脏数据清洗
- Cpp环境【OpenJudge3344】【Vijos2874】冷血格斗场
- csdn markdown 使用方法,快捷键
- threadlocal与数据库连接池
- hdu 5726 GCD 2016多校赛第一场
- rxjava+retrofit+okhttp 打造通用接口
- 孪生素数问题 &&一种排序 && 大数阶乘 &&筛素(2)
- XML 解析--SAX
- Android—ContentProvider读取系统联系人
- iOS开发UI篇-自定义CALayer
- 应用优化
- 直接用编译器按ctrl+F5运行和Release、Debug下双击运行结果不一样
- java中读取配置文件的方法
- XSS攻击
- 一代记忆
- ThreadLocal误区解密