题目大意:在一个方格中,给出
A
,
B
,
F
A,B,F
A,B,F三点,每次能向上下左右移动一格,但不能经过
F
F
F问
从
A
到
B
从A到B
从A到B最少要移动多少次
分析:
假设不考虑
F
F
F,那么
A
−
>
B
A->B
A−>B的最短距离就是
∣
A
x
−
B
x
∣
+
∣
A
y
−
B
y
∣
|A_x-B_x|+|A_y-B_y|
∣Ax−Bx∣+∣Ay−By∣
之后我们发现如果
A
x
≠
B
x
或
A
y
≠
B
y
A_x\not=B_x 或 A_y\not=B_y
Ax=Bx或Ay=By那
A
,
B
A,B
A,B之间其实是有很多个最短路径的,其中肯定有不经过
F
F
F的,那么直接输出
∣
A
x
−
B
x
∣
+
∣
A
y
−
B
y
∣
|A_x-B_x|+|A_y-B_y|
∣Ax−Bx∣+∣Ay−By∣
但如果
A
x
=
B
x
或
A
y
=
B
y
A_x=B_x 或 A_y=B_y
Ax=Bx或Ay=By呢?我们先假设
A
x
=
B
x
A_x=B_x
Ax=Bx,那么最短路径就只有一条,为线段
A
B
AB
AB,如果要经过
F
F
F,那么
F
F
F要满足在
A
B
AB
AB上,则
F
x
=
A
x
=
B
y
,
m
i
n
(
A
y
,
B
y
)
⩽
F
y
⩽
m
a
x
(
A
y
,
B
y
)
F_x=A_x=B_y,min(A_y,B_y) \leqslant F_y \leqslant max(A_y,B_y)
Fx=Ax=By,min(Ay,By)⩽Fy⩽max(Ay,By),所以
A
B
AB
AB间的距离就要绕路,其实就是
∣
A
x
−
B
x
∣
+
∣
A
y
−
B
y
∣
+
2
|A_x-B_x|+|A_y-B_y|+2
∣Ax−Bx∣+∣Ay−By∣+2,如果
F
y
F_y
Fy不满足条件,还是与
1.
1.
1.一样。
题目大意:给出一个数
k
k
k,和两个长度分别为
n
,
m
n,m
n,m的数列
a
,
b
a,b
a,b,每次操作可以从
a
或
b
a或b
a或b的队首取走一个数
a
i
或
b
j
a_i或b_j
ai或bj。如果,
a
i
或
b
j
=
0
a_i或b_j=0
ai或bj=0,那么将
k
+
1
k+1
k+1,否则如果
k
⩾
i
或
k
⩾
b
j
k\geqslant _i 或 k\geqslant b_j
k⩾i或k⩾bj就可以执行,否则就不可以执行这个操作,问能不能将
a
,
b
a,b
a,b都取完
分析:
我们可以利用贪心的思想,因为要
k
⩾
a
i
或
b
j
k\geqslant a_i或b_j
k⩾ai或bj,那么我们肯定要
k
k
k尽可能的大,于是就要先执行
a
,
b
a,b
a,b中队首为
0
0
0的,如果都不为
0
0
0,就先执行
a
i
,
b
j
a_i,b_j
ai,bj中较小的
题目大意:给出
A
A
A数列,找到一个字典序最小的
B
B
B数列,令数列
C
C
C,
C
i
=
A
i
⊕
B
i
C_i=A_i \oplus B_i
Ci=Ai⊕Bi,且
C
i
A
N
D
C
i
+
1
=
C
i
C_i \ \ AND\ \ C_{i+1}=C_i
CiANDCi+1=Ci
分析:
由题目可以知道
(
A
i
⊕
B
i
)
A
N
D
(
A
i
+
1
⊕
B
i
+
1
)
=
(
A
i
⊕
B
i
)
(A_i \oplus B_i) \ \ AND \ \ (A_{i+1} \oplus B_{i+1})=(A_i \oplus B_i)
(Ai⊕Bi)AND(Ai+1⊕Bi+1)=(Ai⊕Bi)因为我们要
B
i
+
1
B_{i+1}
Bi+1尽可能小,所以取
(
A
i
+
1
⊕
B
i
+
1
)
(A_{i+1} \oplus B_{i+1})
(Ai+1⊕Bi+1)的最小值
∴
(
A
i
+
1
⊕
B
i
+
1
)
=
(
A
i
⊕
B
i
)
\therefore (A_{i+1} \oplus B_{i+1})=(A_i \oplus B_i)
∴(Ai+1⊕Bi+1)=(Ai⊕Bi)
∴
B
i
+
1
=
A
i
⊕
B
i
⊕
A
i
+
1
\therefore B_{i+1}=A_i \oplus B_i \oplus A_{i+1}
∴Bi+1=Ai⊕Bi⊕Ai+1
这样
B
B
B的递推式就出来了,有因为字典序要最小,所以
B
1
=
0
B_1=0
B1=0,递推即可
题目大意:有
n
n
n个房间和
k
k
k个空调,第
A
i
A_i
Ai个房间里有一个空调,空调温度为
T
i
T_i
Ti,第
i
i
i个房间的温度为
m
i
n
j
=
1
k
(
∣
A
j
−
i
∣
+
T
j
)
min_{j=1}^{k}(|A_j-i|+T_j)
minj=1k(∣Aj−i∣+Tj),求每个房间的温度
分析:
首先我们可以进行暴力模拟,但这样会超时,所以我们经过观察,发现这个房间的最低温度为它
M
i
n
(
左
边
房
间
的
最
低
温
度
+
1
,
右
边
房
间
最
低
温
度
+
1
)
Min(左边房间的最低温度+1,右边房间最低温度+1)
Min(左边房间的最低温度+1,右边房间最低温度+1),所以我们可以把这个问题分成两部分,分别求
L
i
L_i
Li表示左边空调可以让
i
i
i号房间能到底的最低温度,右边同理
这个问题我们可以用
D
P
DP
DP来解决,初始化每个房间都是
2
31
−
1
2^{31}-1
231−1,之后使得
L
A
i
=
T
i
L_{A_i}=T_i
LAi=Ti,容易得到转移方程就是
L
i
=
m
i
n
(
L
i
−
1
+
1
,
L
i
)
L_i=min(L_{i-1}+1,L_i)
Li=min(Li−1+1,Li),所以每个房间的温度就是
m
i
n
(
L
i
,
R
i
)
min(L_i,R_i)
min(Li,Ri)
题目大意:给出一个数列
A
A
A,求最小的长度
l
e
n
len
len,使得
g
c
d
(
A
1
,
A
2
,
.
.
.
,
A
1
+
l
e
n
−
1
)
=
g
c
d
(
A
2
,
A
3
,
.
.
.
,
A
2
+
l
e
n
−
1
)
=
.
.
.
=
g
c
d
(
A
n
,
A
1
,
.
.
.
,
A
(
n
+
l
e
n
−
1
)
%
n
)
gcd(A_1,A_2,...,A_{1+len-1})=gcd(A_2,A_3,...,A_{2+len-1})=...=gcd(A_n,A_1,...,A_{(n+len-1)\%n})
gcd(A1,A2,...,A1+len−1)=gcd(A2,A3,...,A2+len−1)=...=gcd(An,A1,...,A(n+len−1)%n)
分析:
看到求一个区间的
g
c
d
gcd
gcd,我们容易想到用线段树维护一些区间
g
c
d
gcd
gcd,之后二分长度就可以求出
l
e
n
len
len,时间复杂度
O
(
t
∗
(
n
∗
log
2
n
+
log
2
n
∗
log
2
n
)
)
O(t*(n*\log_2n+\log_2n*\log_2n))
O(t∗(n∗log2n+log2n∗log2n))