<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zz_Black的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zz_Black</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zz_Black]]></copyright><item><title><![CDATA[2015北京网赛 G Boxes bfs]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48598911</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48598911</guid><author>zz_Black</author><pubDate>Sun, 20 Sep 2015 18:37:58 +0800</pubDate><description><![CDATA[题目大意： 给你n（ n    ，2，（1 3） —> ， （1 2）， 3 —> 1， 2， 3 这4次变换达到。
思路：就是状态压缩之后的bfs了， 用一个n位整数来存每个数在第几个位置上， 这里不能存“第i个位置上是哪一个数”这种状态， 因为大多数状态都是一个位置上有多个数。然后从就可以从题目要求的最终状态出发， 找到所有可达状态了。也就是一开始1， 12， 123， 1234， ...，]]></description><category></category></item><item><title><![CDATA[Hdu 5444 Elven Postman 2015长春网赛1008]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48443013</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48443013</guid><author>zz_Black</author><pubDate>Mon, 14 Sep 2015 18:19:07 +0800</pubDate><description><![CDATA[题意：有一颗倒过来的二叉树， 节点的标号方式是从右往左一顺标记然后又q个查询， 输出从根节点到某个点的路径。
说是标号从右往左， 实际上也就是，每个点一定大于他的右儿子小于他的左二子， 按这个规则建的树而已， 然后边建树边存每个点的路径就行了。
以前做过一道单纯建树没有查询的题，点上限是1e5，按道理说O(n²）的暴力建树是会T的但是居然给过Orz， 那次比赛冥思苦想好久才想出来一个O(nlo]]></description><category></category></item><item><title><![CDATA[ZOJ 3735 Josephina and RPG 概率dp水题。]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48328839</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48328839</guid><author>zz_Black</author><pubDate>Thu, 10 Sep 2015 00:30:55 +0800</pubDate><description><![CDATA[题目大意： 现在有n个角色， 3个玩家用不同的角色来组队刷本， 也就是有C(n,3)种组合方式， 题目给出了这些组合方式之间对战的胜率， 然后每过一关你有一个选择：继续以当前配置进入下一关， 或者用这一关的敌人的配置进入下一关。求最后通关的最大胜率，。保留6位小数。
就是一个概率dp， 弱用了记忆化搜索来写， dp[i][j]记录第i关用配置j的最大， 递推方程也挺好写， 见代码：
#incl]]></description><category></category></item><item><title><![CDATA[HDU 4941 Magical Forest 离散化]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48328749</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48328749</guid><author>zz_Black</author><pubDate>Thu, 10 Sep 2015 00:25:35 +0800</pubDate><description><![CDATA[题意： 一个n * m 的图， 某些点有苹果，每个苹果有价值， 然后现在交换某些行或者列， 或者查询某个点的苹果的价值（没有苹果就是0）。
还是比较好想的。。x[],y[]数组存当前状态下的各行各列存的是初始时的哪一行哪一列，交换的时候交换值就行了， 可能复杂就在离散化吧，不过实际上用map离散化也挺easy的样子。。虽然我用的最传统的vector、sort、 unique、resize然后up]]></description><category></category></item><item><title><![CDATA[FZU 2156 Climb Stairs]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48328619</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48328619</guid><author>zz_Black</author><pubDate>Thu, 10 Sep 2015 00:22:27 +0800</pubDate><description><![CDATA[题目大意： 你要从0层开始， 经过A， 和B层， 到达N层， 每次可以走x或者y层， 输出方法数。
比较简单的dp了吧。。只是处理方式稍微机智点（虽然还是比较好想到的）， 递推方程dp[i] = dp[i - x] + dp[i - y],然后输出dp[A] + dp[B - A] + dp[N - B]，（事先swap保证A #include 
#include 
#include 
#inc]]></description><category></category></item><item><title><![CDATA[Zoj 3761 Easy billiards dfs]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48327769</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48327769</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 23:54:15 +0800</pubDate><description><![CDATA[在桌面上给你一些球， 你可以选择击任意一个球， 向4个方向， 但是要求是球运动过程中必须能装上另一个球， 也即至少在这个方向上还存在一个球。然后撞上一个球后，之前的一个球停在碰撞处， 被碰撞的求继续按撞他的球的方向运动直到离开桌面，然后问你桌面上最少能存在几个球， 输出击球顺序（坐标，方向）。
比赛的时候我的思路是吧能撞到的求连边然后从入度为0的点去撞其它球， 如果有环的话就随便撞一个就是了， ]]></description><category></category></item><item><title><![CDATA[Zoj 3647 Gao the Grid （数论？）]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48327105</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48327105</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 23:46:26 +0800</pubDate><description><![CDATA[给你n * m 的的矩形方格， 也即有(n + 1) * (m + 1) 个点， 然后问可以找到做少个三角形。
n比较大显然是不能暴力枚举的， 然后想dp递推也发现太复杂了，，于是想逆向求解，比赛的时候想的是枚举斜率， 然后判断当前斜率下右多少点共线， 再考虑平移， 可是还是不对，，跟ac代码比了很多样例都是没问题的。。醉了。

然后Ac代码的解题方式是， 枚举每条直线的一个端点， 另一个端]]></description><category></category></item><item><title><![CDATA[HDU 3986 Harry Potter and the Final Battle 最短路]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48326777</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48326777</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 23:29:34 +0800</pubDate><description><![CDATA[题目大意： 给你一个无向图， 蓝厚让你删掉一条边， 让剩下的图中的最短路 最长， maxmin系列。。
一开始想不出来解法， 就准备暴力一发试试， 也就是找到最短路之后一条条拆边， 然后不出意外的T了， 以为有什么厉害的算法， 结果赛后发现- -只因为删边的时候没加
if( ans == inf) break; 这一句， 啊啊啊居然卡这种数据我也是醉了， 然后就噩梦#include "iost]]></description><category></category></item><item><title><![CDATA[HDU 3951 Coin Game 博弈论]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48326263</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48326263</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 23:16:42 +0800</pubDate><description><![CDATA[题目大意： 给你n个硬币围成一圈， 两人轮流拿连续的硬币， 拿的个数不能大于k个， 另外只能拿连续的，中间有间隔就不能拿。
这题其实挑战上有一道类似的，，比赛的时候想了个思路感觉可以然后写了写一不小心就过了Orz， 首先说特殊情况， k = 1 的时候只能一人一次拿一个也就是说输赢看奇偶， 然后n  k 的时候后手必胜这个当时真真是不敢交。。思路其实挺好理解， 先手拿了几颗后， 后手在对面拿， ]]></description><category></category></item><item><title><![CDATA[Zoj 3646 Matrix Transformer 二分图完美匹配]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48325927</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48325927</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 23:02:48 +0800</pubDate><description><![CDATA[题目大意：给你一个n * n 的二维图， 每个点都有一个方向， 上或者下， 用U和D表示， 蓝厚问你交换任意次整行后， 能不能让主对角线上全部都是U。
第一眼一看， 水题啊贪心搞一搞就行了啊，然后写到一半发现并不能随意水过去， 情况太多了Orz， 然后就想，难道是网络流，，当时一直以为有更简单的解法可是赶时间懒得想就直接dinic上去干了，，后来发现这题真是网络流， 每个U点的行和列对应点连边，]]></description><category></category></item><item><title><![CDATA[Uva 12549 Sentry Robots 网络流 - 二分图匹配]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48325661</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48325661</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 22:59:55 +0800</pubDate><description><![CDATA[题目大意见紫书P381。 
这道题是比较明显的二分图建模吧， 这类题的建模思维很常见， 对于每个点， 对应的横纵坐标只需要选一个点， 那么将横纵坐标看作在二分图两边的两个点然后连边即可， 只是这题有障碍物所以不能单纯的按上面提到的横纵坐标来， 要经过处理。

#include 
#include 
#include 
#include 
#include 
#include 
#includ]]></description><category></category></item><item><title><![CDATA[Uva 10622 Perfect Pth Power 唯一分解定理]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48316461</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48316461</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 15:12:21 +0800</pubDate><description><![CDATA[题意见紫书P343.
既然要是b的p次方， 很容易就能想到唯一分解然后每个质因数的次数的gcd， 可是一直无脑wa真是快崩溃了。。瓦擦擦然后看了别人代码才知道原来还可以是负数。。。真是【哔---】了- -， 然后负数变成整数再分解再gcd， 这里就要注意次幂不能是偶数，所以while(!(ans & 1)) ans >>= 1;

#include 
#include 
#include 
]]></description><category></category></item><item><title><![CDATA[Hdu 1025 Constructing Roads In JGShining's Kingdom 最大上升子序列nlogn算法]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48316323</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48316323</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 15:03:32 +0800</pubDate><description><![CDATA[题目大意：两条线上各有n个点， 第一条线上每个点要跟另一条线上某个点连边， 然而由于边不能交叉所以很多边不能连上， 问你最多能连上多少条边。
这题就是比较难看出来。。其实读入的时候读进去一对对u, v， 相当于就是a[u] = v；然后从a[1] ~ a[n]中选出一些数， 这些数必须是递增的因为这样才能保证没有交叉， 于是就变成了 LIS。。比较神奇， 但是代码很简单， 难在想出算法， 多理一]]></description><category></category></item><item><title><![CDATA[Hdu 1978 How many ways 二维dp水题。。]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48316235</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48316235</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 14:58:50 +0800</pubDate><description><![CDATA[嗯题目是中文多琢磨就懂了就不解释了。
我只是来水一发题解。。  直接两层循环， 遍历每个点然后对于每个点将从这个点出发可达的每个点的方法数都再加上这个点的方法数，随便水一水就过了。。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#inc]]></description><category></category></item><item><title><![CDATA[LightOj 1018 Brush (IV) 状压dp]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48315771</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48315771</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 14:33:39 +0800</pubDate><description><![CDATA[题目大意： 有n个灰尘， 给出坐标， 吸尘器每次可以清理一条线上的全部灰尘， 问最少需要画几条线将全部灰尘覆盖。
一开始理解错题意了以为下一次画线的起点必须是上一次的终点Orz  后来发现每一次都可以随意确定起点终点。 所以直接就更简单了， 01代表这个灰尘是否还存在。
由于画线是任意的， 所以可以随意取一个点 然后枚举另一个点然后用这两个点画线（这里的随意具体到代码就是找到该状态的第一个1）]]></description><category></category></item><item><title><![CDATA[LightOj  1186 Incredible Chess nim游戏]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48315595</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48315595</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 14:24:07 +0800</pubDate><description><![CDATA[不知道这题放出来算不算凑数Orz；
题目大意就是  棋盘上每一纵列有黑白两个棋子， 黑色一定在白色上方，两个人一人各执一色， 白色先走，每次操作可以把自己的颜色向上或者向下移动任意格， 但是不能超出范围也不能越过另一色的棋， 无法操作的一方败。
移到比较经典的nim游戏题。。每一纵列黑白棋之间的空格数作为这一堆的石子数然后全部异或就行。。结果为0就先手败否者先手胜。 
详细证明请移步：htt]]></description><category></category></item><item><title><![CDATA[Light Oj 1194 colored T-shirts 经典状压dp]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48315227</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48315227</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 14:12:54 +0800</pubDate><description><![CDATA[这道题跟2014微软编程之美复赛的一道机器人是一模一样的题。。
首先预处理， cnt[i][j] =记录的是 在这个序列中可以取出的  不同的  对 ，（注意这里的i,j不是下标而是数）， 而这个的意义是， 假如这个序列只存在i和j这两个数， 那么把i全部交换到j之前所花费的交换次数（毕竟每次交换i，j，就相当于少了一个 对）；
然后进行状态压缩， 0代表这种颜色已经全部都聚集在一起并且 所有]]></description><category></category></item><item><title><![CDATA[Uva 1632 alibaba 区间dp]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48314895</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48314895</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 13:45:50 +0800</pubDate><description><![CDATA[题意见紫书P306。
这道题跟例题的修长城比较像， 也是用三维dp记录一个区间i, j ， Alibaba在左端点或者右端点的时候的最短时间， 那么转移方程就是：
dp[i][j][0] = min(dp[i + 1][j][0] + a[i + 1] - a[i], dp[i + 1][j][1] + a[j] - a[i]);
dp[i][j][1] = min(dp[i][j - 1]]]></description><category></category></item><item><title><![CDATA[ACDream dp专题 B - 喵哈哈村的挑衅]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48314739</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48314739</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 13:31:25 +0800</pubDate><description><![CDATA[中文题不解释。
区间dp裸题吧，，是两断区间所以要记录两个l，r， dp[l1][r1][l2][r2]记录当前状态下先手取能得到的最大值， 从整个区间递推到底就行了。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#in]]></description><category></category></item><item><title><![CDATA[ACDream dp专题 C - 哗啦啦村的扩建]]></title><link>https://blog.youkuaiyun.com/zz_Black/article/details/48314599</link><guid>https://blog.youkuaiyun.com/zz_Black/article/details/48314599</guid><author>zz_Black</author><pubDate>Wed, 09 Sep 2015 13:18:21 +0800</pubDate><description><![CDATA[中文题反而更容易让人误解，，所谓每条路的左边x个房子右边y个房子。。其实就是每条路的一端的房子数和另一端的房子数。然后按题目的公式算。
树形dp一个dfs就可以解决了， 求出每条路的一端连上了多少个房子， 另一端显然就是n减掉这一端的，坑就坑在题意了吧，，题目不难。
当然坑点也是有的，，万万分之一也就是说结果要乘1e8， 可是结果是0的时候又只能输出0。
#include 
#include]]></description><category></category></item></channel></rss>