2017.11.6 Problem A
题目大意:
n
n
n个人围成一个环,编号为
1
1
1 ~
n
n
n,从
1
1
1号开始从
1
1
1报数,每次报到
m
m
m时,报
1
1
1 ~
m
−
1
m-1
m−1的人出列,下一个人继续报
1
1
1,问最后留下的人的编号。保证
m
−
1
∣
n
−
1
m-1|n-1
m−1∣n−1。
做法: 本题需要用到递归。
n
n
n个人进行这个游戏的话,如果就这样顺着报下去,那么剩下的就只有编号为
m
m
m的倍数的人和最后
n
%
m
n\%m
n%m个人,相当于把后
n
%
m
n\%m
n%m个人移到前面,然后做一个
⌊
n
/
m
⌋
+
n
%
m
\lfloor n/m\rfloor+n\%m
⌊n/m⌋+n%m个人的子问题,递归求解即可,时间复杂度约为
O
(
log
m
n
)
O(\log_m n)
O(logmn)。
2017.11.6 Problem B
题目大意: 对一个
1
1
1~
n
n
n的排列
A
A
A进行一种排序,步骤是每次枚举数对
(
i
,
i
+
X
)
(i,i+X)
(i,i+X),如果
A
i
>
A
i
+
X
A_i>A_{i+X}
Ai>Ai+X则交换这两个数,直到没有满足要求的数对为止。问有多少种
X
X
X能使这个排列最后能排成升序,并求出这些
X
X
X。
n
≤
500000
n\le 500000
n≤500000。
做法: 本题需要用到问题转化+gcd。
注意到,
A
i
A_i
Ai能排到原来位置的充要条件是
i
≡
A
i
(
m
o
d
X
)
i\equiv A_i(\mod X)
i≡Ai(modX),这意味着
X
X
X是
∣
i
−
A
i
∣
|i-A_i|
∣i−Ai∣的因数,因为要满足所有这样的条件,那么我们求所有
∣
i
−
A
i
∣
|i-A_i|
∣i−Ai∣的最大公因数,那么可行的
X
X
X就是这个最大公因数的所有因数。时间复杂度为
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
2017.11.6 Problem C
题目大意: 一个国家有若干个城市坐落在数轴的非负整数点上,首都为
0
0
0,每个城市有一个车站,有
n
n
n列火车从首都开出,并到达一个目标城市
S
i
S_i
Si,中间任意车站都可以停靠,而每列火车都有一个能容纳乘客的量
C
i
C_i
Ci。有
m
m
m个乘客要乘车,第
i
i
i个乘客要在
L
i
L_i
Li站上车,在
R
i
R_i
Ri站下车,问在不超过火车容量限制的情况下,最多能满足多少名乘客的乘车需求。
做法: 本题需要用到贪心,然而我并不太会,原题应该是CQOI2016的。
2017.11.7 Problem A
题目大意: 在一个
n
×
n
n\times n
n×n的透明玻璃片上的每一个
1
×
1
1\times 1
1×1的小格涂上颜色,如果一个涂色方案使得这个玻璃片无论如何旋转、翻转,看起来都和原来一样,那么这个图被称作回文图,而现在有
m
m
m个小格已经被涂上了颜色,颜色共有
k
k
k种,问有多少种涂成回文图的涂色方案。
做法: 本题需要用到置换映射+组合计数+快速幂。
仔细分析一下,一个格子
(
x
,
y
)
(x,y)
(x,y)(坐标值均为
0
0
0~
n
−
1
n-1
n−1之间的数),无论经过多少次旋转、翻转操作,最后转移到的点的坐标只有
8
8
8个:
(
x
,
y
)
(x,y)
(x,y),
(
n
−
1
−
x
,
y
)
(n-1-x,y)
(n−1−x,y),
(
x
,
n
−
1
−
y
)
(x,n-1-y)
(x,n−1−y),
(
n
−
1
−
x
,
n
−
1
−
y
)
(n-1-x,n-1-y)
(n−1−x,n−1−y),
(
y
,
x
)
(y,x)
(y,x),
(
n
−
1
−
y
,
x
)
(n-1-y,x)
(n−1−y,x),
(
y
,
n
−
1
−
x
)
(y,n-1-x)
(y,n−1−x),
(
n
−
1
−
y
,
n
−
1
−
x
)
(n-1-y,n-1-x)
(n−1−y,n−1−x)。可以证明这
8
8
8个坐标经过旋转、翻转之后仍然在这
8
8
8个坐标之内,那么我们把这样的
8
8
8个坐标的集合体叫做等价类,根据回文图的定义可知,同一个等价类内的格子只能涂同一种颜色。那么问题转化为求有多少个等价类可以随便涂色,因为已经有
m
m
m个格子已经被涂上颜色了,那么这些格子所属的等价类也相当于被涂上颜色了,
O
(
m
2
)
O(m^2)
O(m2)判定一下这
m
m
m个格子的限制使得多少等价类受到限制即可。
n
×
n
n\times n
n×n方阵中总的等价类数应该为
⌊
n
+
1
2
⌋
(
⌊
n
+
1
2
⌋
+
1
)
2
\frac{\lfloor \frac{n+1}{2}\rfloor(\lfloor \frac{n+1}{2}\rfloor+1)}{2}
2⌊2n+1⌋(⌊2n+1⌋+1)(这个自己想想应该就能明白了吧),用这个数减去受限制的等价类数就是能任意涂色的等价类数了,令这个数为
p
p
p,那么答案显然为
k
p
k^p
kp,用快速幂求出即可,时间复杂度为
O
(
m
2
+
log
n
2
)
O(m^2+\log n^2)
O(m2+logn2)。
2017.11.7 Problem B
题目大意: 一棵树有
n
n
n个点,每个点可能是白色或黑色,问有多少种分割方法,使得分割后的每个连通块内有且仅有一个黑色点。
做法: 本题需要用到树形DP。
令
f
(
i
)
f(i)
f(i)为在以
i
i
i为根的子树中切割,使得
i
i
i所在的连通块内不含黑色点,其余连通块都含一个黑色点的切割方案数,
g
(
i
)
g(i)
g(i)为在以
i
i
i为根的子树中切割,使得每个连通块内都含且仅含一个黑色点的切割方案数,那么有状态转移方程(下列
j
j
j表示
i
i
i的所有儿子):
如果点
i
i
i为黑色点:
f
(
i
)
=
0
f(i)=0
f(i)=0
g
(
i
)
=
∏
j
(
f
(
j
)
+
g
(
j
)
)
g(i)=\prod_j(f(j)+g(j))
g(i)=∏j(f(j)+g(j))
其中
g
(
i
)
g(i)
g(i)的式子可理解为,对于
i
i
i的每一个儿子,要么选择连接
i
i
i与这个儿子的边,这样的话方案数为
f
(
j
)
f(j)
f(j),要么选择断开
i
i
i与这个儿子的边,这样的话方案数为
g
(
j
)
g(j)
g(j)。
如果点
i
i
i为白色点:
f
(
i
)
=
∏
j
(
f
(
j
)
+
g
(
j
)
)
f(i)=\prod_j(f(j)+g(j))
f(i)=∏j(f(j)+g(j))
g
(
i
)
=
∑
j
g
(
j
)
∏
s
o
n
≠
j
(
f
(
k
)
+
g
(
k
)
)
g(i)=\sum_jg(j)\prod_{son\ne j}(f(k)+g(k))
g(i)=∑jg(j)∏son=j(f(k)+g(k))
其中
g
(
i
)
g(i)
g(i)的式子也可写成
g
(
i
)
=
∑
j
f
(
i
)
f
(
j
)
+
g
(
j
)
g
(
j
)
g(i)=\sum_j\frac{f(i)}{f(j)+g(j)}g(j)
g(i)=∑jf(j)+g(j)f(i)g(j),用逆元算出,然而也可以直接算上面的式子,具体计算方法见代码。
那么最后的答案显然为
g
(
r
o
o
t
)
g(root)
g(root),总的时间复杂度为
O
(
n
)
O(n)
O(n)(用逆元的话会退化到
O
(
n
log
n
)
O(n\log n)
O(nlogn))。
2017.11.7 Problem C
题目大意: 一个
n
n
n个点
m
m
m条边带边权的无向连通图,
q
q
q个询问,每次询问两点之间的最短路径长度。有
4
4
4类数据:1.
n
≤
1000
,
n
−
1
≤
m
≤
1200
n\le 1000,n-1\le m\le 1200
n≤1000,n−1≤m≤1200。2.
m
=
n
−
1
m=n-1
m=n−1。3.
m
=
n
m=n
m=n。4.
m
>
n
m>n
m>n,每条边最多在一个环上。
做法: 本题主要用到LCA。
对于第一类数据,暴力跑
n
n
n遍SPFA即可,时间复杂度约为
O
(
n
m
)
O(nm)
O(nm)。
对于第二类数据,所给图为一棵树,根据
d
i
s
(
a
,
b
)
=
d
i
s
(
r
o
o
t
,
a
)
+
d
i
s
(
r
o
o
t
,
b
)
−
2
d
i
s
(
r
o
o
t
,
l
c
a
(
a
,
b
)
)
dis(a,b)=dis(root,a)+dis(root,b)-2dis(root,lca(a,b))
dis(a,b)=dis(root,a)+dis(root,b)−2dis(root,lca(a,b)),在线倍增或离线Tarjan求出LCA即可,时间复杂度为
O
(
(
n
+
q
)
log
n
)
O((n+q)\log n)
O((n+q)logn)或
O
(
n
+
q
)
O(n+q)
O(n+q)。
对于第三类数据,所给图为一棵环套树,那么我们可以先找环,然后如果
a
,
b
a,b
a,b在同一棵外向树中,直接按照第二类求即可,否则找到它们所在外向树的根,它们之间路径的最短路就是它们各自到外向树根的距离之和+这两个根在环上的最短路。时间复杂度为
O
(
(
n
+
q
)
log
n
)
O((n+q)\log n)
O((n+q)logn)或
O
(
n
+
q
)
O(n+q)
O(n+q)。
对于第四类数据,所给图为一个仙人掌,然而我不会圆方树之类的奇妙数据结构,故不会做,原题应为BZOJ2125。