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