折半搜索总结
当看到n非常小的时候,一般是(25~40),想暴力但是会T,这时候就可以想一想是否需要折半搜索
主要步骤有2个:
1.搜前一半,存答案
2.搜后一半,得到的结果和前一半去匹配
一般来说搜索只需要最普通的dfs即可,而存答案多和stl有关
经典例题:
L
i
g
h
t
s
w
i
t
c
h
e
s
Light\; switches
Lightswitches(如果对半分容易T,那么预处理的时候多处理一点,处理20个,剩下在询问的时候处理即可)
X
o
r
−
P
a
t
h
s
Xor-Paths
Xor−Paths(显然在对角线处分开,这里处理的时候要记一下:当
x
+
y
=
=
(
n
+
m
)
/
2
+
1
x+y==(n+m)/2+1
x+y==(n+m)/2+1的时候,
(
x
,
y
)
(x,y)
(x,y)就是对角线上的点了)
M
a
x
i
m
u
m
S
u
b
s
e
q
u
e
n
c
e
Maximum \;Subsequence
MaximumSubsequence(首先先把所有数字对m取模,然后求出前一半所有可能的和,后一半所有可能的和,设前一半的一个值为x,则在后一半里找比m-x小的第一个数即可)
L
i
z
a
r
d
E
r
a
:
B
e
g
i
n
n
i
n
g
Lizard \;Era: Beginning
LizardEra:Beginning(枚举每个工作要分给哪些人,并用三进制状压记录方案就ok了,但是注意,在输出方案的时候,有最后一位对应的就是0,所以直接while(x)是不对的,应该给出明确的循环次数)