1787: [Ahoi2008]Meet 紧急集合

2013年3月25日 14:53

http://www.lydsy.com/JudgeOnline/problem.php?id=1787

RunID User Problem Result Memory Time Language Code_Length Submit_Time
375404 Liu_Ts 1787 Accepted 45732 kb 7584 ms C++ 2039 B 2013-03-25 11:25:27

 

题意

一棵树,每次询问给三个点,求一个点使得到这三个点的距离和最小。

题解

理解一下,可知答案必定在这三个点中,某两个点的LCA上,

于是枚举a,b;a,c;b,c的LCA。

最后发现这三个LCA有规律,有两个一定相同,但是不会用。

LCA写的RMQ比较慢啊

 

Tags: bzoj AHOI
评论(0) 阅读(841)

1774: [Usaco2009 Dec]Toll 过路费

2013年3月22日 15:19

http://www.lydsy.com/JudgeOnline/problem.php?id=1774

RunID User Problem Result Memory Time Language Code_Length Submit_Time
373994 Liu_Ts 1774 Accepted 1300 kb 304 ms C++/Edit 1013 B 2013-03-22 14:42:09

 

题意

一个图,每条边有边权,每个点也有点权,

定义两个点之间的费用为,两点之间的路径长度加上路径上最大的一个点权。

询问任意两个点对的最小费用。

题解

一看到是求任意点对的费用,就要floyd

然后floyd的性质保证当过渡点循环到k时,所有经过的点的编号<=k;

于是,我们按点权从小到大排序后,floyd。

 

Tags: bzoj usaco
评论(0) 阅读(1203)

1084: [SCOI2005]最大子矩阵

2013年3月22日 09:23

http://www.lydsy.com/JudgeOnline/problem.php?id=1084

RunID User Problem Result Memory Time Language Code_Length Submit_Time
373714 Liu_Ts 1084 Accepted 1248 kb 64 ms C++ 1227 B 2013-03-22 08:51:24

 

题意

这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。

题解

这题我是一定不会的。。。

可是数据范围比较厉害。偶然翻题解发现原来m≤2,坑爹。

于是DP。

当 m=1 时

    g[i][j]表示前i个数字选出j段的最大分值

当 m=2 时

    f[i][j][k]表示第一列前i个数字,第二列前j个数字选出k个子矩阵的最大分值

    f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);

    f[i][j][k]=max{f[i][j][k],f[x][j][k-1]+s1[i]-s1[x]};

    f[i][j][k]=max{f[i][j][k],f[i][y][k-1]+s2[j]-s2[y]};

    当 i=j 时 

        f[i][j][k]=max{f[i][j][k],f[x][x][k-1]+s1[i]-s1[x]+s2[i]-s2[x]};

 

 

 

Tags: bzoj SCOI
评论(0) 阅读(1427)

1779: [Usaco2010 Hol]Cowwar 奶牛战争

2013年3月21日 21:13

http://www.lydsy.com/JudgeOnline/problem.php?id=1779

RunID User Problem Result Memory Time Language Code_Length Submit_Time
369713 Liu_Ts 1779 Accepted 2440 kb 24 ms C++ 2171 B 2013-03-16 21:29:34

 

题意

太复杂了。。所以

http://www.nocow.cn/index.php/USACO/cowwar

题解

这题感觉就是利用网络流,瞪眼建模,通过流量来满足条件。

http://www.dxmtb.com/blog/usaco2010-hol-cowwar/

1.一个E点拆成两个点。把一个J点拆成三个点。T点不变。

2.从原点向每个J的第一个点连一条边容量为1,表示只有一只牛。

3.从J的第一个点连边到能到的点。能到的J点连第二个点,能到的E点连第一个点,容量都为1。注意,J也能到他自己。

4.对于每个能攻击的J点,把第三个J点连一条容量为1的边到能攻击的T。对于每个能攻击的E点,把第二个E点连到能攻击的T点,容量还是1。

5.把E的第一个点连一条容量为1的边到第二个点,表示只能从这个点攻击一次。J的第二个点连一条容量为1的边到第三个点,也表示只能从这个点攻击一次。

6.每个T点连一条边到汇点,容量为1。

 

 

Tags: bzoj usaco
评论(0) 阅读(1158)

3011: [Usaco2012 Dec]Running Away From the Barn

2013年3月21日 20:03

http://www.lydsy.com/JudgeOnline/problem.php?id=3011

RunID User Problem Result Memory Time Language Code_Length Submit_Time
370535 Liu_Ts 3011 Accepted 14804 kb 908 ms C++ 1039 B 2013-03-17 23:35:13

 

题意

给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于L的点有多少个。

题解

dfs,对于每个点,打一个+1的标记,在从它到根的路径上,第一个大于>L的点打一个-1的标记,

则每个点的答案就是以它为根的子树的标记和。

官方题解写的倍增,我只会记录dfs序列,然后二分。

 

Tags: bzoj usaco
评论(1) 阅读(1828)