前言
之前有一些写过了大概扔在奇奇妙妙的地方…
可能翻一下blog能翻得到的
瞎写一下最近的题吧
bzoj3717: [PA2014]Pakowanie
2242^{24}224这个状压和爆搜尴尬的地位…90s90s90s果断状压了
把包从大到小排序,记一个pairpairpair的dp[mask]dp[mask]dp[mask]表示装完状态里的这些东西需要用到哪个包,并且最后一个包剩下多少容积,这显然是从大往小装并且能装的越多越好嘛…
转移枚举000位,可以lowbitlowbitlowbit优化
听说复杂度是靠谱的2n−1n2^{n-1}n2n−1n?
bzoj3718: [PA2014]Parking
随意想一下,我们可以首先把这些矩形拉到互不相交的位置
即保证每个矩形上下都是没有矩形的
那么,假如两个矩形先后顺序最后需要调换的话,显然这个厚度需要能让他们调换
即满足任意两个需要交换的矩形都能交换,那么这是合法的
线段树随意维护一下?
树状数组也可以的
**bzoj3711: [PA2014]Druzyny
这个题妙
首先有一个nlog2nnlog^2nnlog2n的做法,即直接分治然后讨论转移
这个ddd的性质,如果我们令g[i]g[i]g[i]表示只考虑ddd的限制,iii最远能从哪里开始转移
显然g[i]g[i]g[i]单调不减,可以用一个单调队列预处理出来
那么我们考虑怎么满足ccc的限制
约定midmidmid表示[l+1,r][l+1,r][l+1,r]区间的最大值的位置,则solve(l,r)solve(l,r)solve(l,r)表示处理[l,mid−1][l,mid-1][l,mid−1]对[mid,r][mid,r][mid,r]的转移
显然我们这一段区间需要满足ccc的限制均为c[mid]c[mid]c[mid]
那么思考如何转移
对于g[i]>=midg[i]>=midg[i]>=mid,直接结束转移
对于g[i]>=lg[i]>=lg[i]>=l的,显然能转移的区间是已知的一段,那么直接在线段树上查找
对于g[i]<lg[i]<lg[i]<l且i−(mid−1)<c[mid]i-(mid-1)<c[mid]i−(mid−1)<c[mid],iii每向后移动一位只会多一个可以转移的位置,用一个变量O(1)O(1)O(1)维护转移即可
对于g[i]<lg[i]<lg[i]<l且i−(mid−1)>=c[mid]i-(mid-1)>=c[mid]i−(mid−1)>=c[mid]的,显然满足这样的数是连续一段并且在该区间仅有一段,二分出右端点在线段树上打标记修改
然后又是一个炫酷的复杂度分析
对于第二个操作,虽然目测是nlog2nnlog^2nnlog2n的复杂度,但是对于每个点,满足l<=g[i]<midl<=g[i]<midl<=g[i]<mid的区间仅会有一个,所以复杂度是nlognnlognnlogn
对于第三个操作,在每个区间中指针最多只会移动min(x,len−x)min(x,len-x)min(x,len−x),那么这个是启发式合并的复杂度,也是nlognnlognnlogn的
对于第四个操作,显然是nlognnlognnlogn
所以就变成优越无比的nlognnlognnlogn了??
感觉考场上遇到这个复杂度分析的题就算想到了也会认为是nlog2nnlog^2nnlog2n的然后自闭?
**bzoj3716: [PA2014]Muzeum
好题
首先一看就是个最大权闭合子图的裸模型
然后naive的以为是奇妙技巧建边跑假的复杂度的网络流?
然后就想不出来奇妙技巧了…
然后…发现这个东西我是根本不会想的啊…从来都是最小割=最大流,从来没有转化回去更改题意来做…
首先,我们可以把每个点的坐标变为(xi∗h,yi∗w)(x_i*h,y_i*w)(xi∗h,yi∗w),因为视野可以看成一个(−w,−h)(-w,-h)(−w,−h)的向量,相互乘一下就变成(−1,−1)(-1,-1)(−1,−1)的向量,那么视野就变为了直角
然后再旋转一下坐标系,使得视野变为在第二象限
按xxx从小到大扫,现在我们变换了问题
从每个保安流流量到物品那里,求最大流多少
那么每个保安,肯定先流yyy最小的,流完之后再流yyy次小的
以此类推
过程用一个set维护
要记住这种 把最小割换为最大流,然后转化为贪心问题的套路啊