T1:南州(south)
在那美丽的南州,有一个美丽的砚池,池边有一圈美丽的花,一共有
n
n
n朵。
某一天,有
n
∗
m
n∗m
n∗m个人去给池边的花施肥,他们每人拿了一袋肥料。但这
n
n
n朵花中有一朵特立独行的花,它只能接受某种特殊的肥料,这
n
∗
m
n∗m
n∗m个人中有
m
m
m个人拿了这种特殊的肥料。
这些人排成一队,按照一种奇怪的方式来给花施肥。
排头给当前的花施肥然后离开,然后开头的
p
p
p个人走到最后,再把顺时针的下一朵花设定为当前花,重复以上操作,直到所有人都离开。
初始时把特立独行的花的顺时针下一朵花设定为当前花。
这些人希望特殊的肥料能够全施到特立独行的花上。
拿了特殊肥料
m
m
m个人应该排在初始队伍的哪些位置,才能达成目标呢?
由于
n
∗
m
<
=
1
e
6
n*m<=1e6
n∗m<=1e6,直接链表模拟即可
T2:六月(june)
六月,是充实的一个月。
六月,有紧张的高考;六月,有紧张的中考;六月,有轻松的期末考;当然,六月还有快乐的儿童节。
六月是如此的充实以至于你的事情太多忙不过来。
你想做的事情可以看做一个字符串a,你需要做的事情可以看做一个字符串b。你需要按序完成所有需要做的事情。你是一个坚定的人,因此你不会改变你想做的事,所以你打算用一个奇奇怪怪的理由来逃掉一些需要做的事。但是由于这个理由很奇怪,所以你只能逃掉连续的一段事情。当然,你还是想要留下一个好印象的,所以你逃掉的事情越少越好。
也就是说,你需要删除b的一个连续子串,使得剩下的部分是a的子序列。
题目长得一匹,都是废话
设
f
[
i
]
f[i]
f[i]表示从头开始
b
b
b串匹配到第
i
i
i位
a
a
a串的位置
设
g
[
i
]
g[i]
g[i]表示从尾开始
b
b
b串匹配到第
i
i
i位
a
a
a串的位置
考虑把
a
a
a串分成两部分,一半由
b
b
b串从头开始匹配,
另一半由
b
b
b串从尾开始匹配,答案即为头尾两部分的长度
由于
f
[
i
]
,
g
[
i
]
f[i],g[i]
f[i],g[i]都满足单调,
O
(
n
)
O(n)
O(n)扫一遍即可
考场智障写二分
T3:荔枝丹(litchi)
祝阿姨得到了许多许多的荔枝丹,每个荔枝丹上都有一个0到9之间的数字。祝阿姨把它们分成许多组,每组表示一个数,且所有组表示的数字合起来恰好是[L,R]内的所有数。
祝阿姨知道悦色老师特别喜欢吃荔枝丹,于是邀请了悦色老师来吃荔枝丹。悦色老师最喜欢吃有数字0的荔枝丹了,她吃掉了所有数字为0的荔枝丹。
祝阿姨想知道还剩下多少不同的组。注意悦色老师吃完后,荔枝丹就无序了,也就是说123和321是同样的组。
如果补上前缀0,使得所有数字位数相等,并把数字看成字符串,并把字符排序,那么问题等价于有多少不同的字符串。
可以发现,字符串的情况很少,一定不超过
C
(
27
,
9
)
=
4686824
C(27,9)=4686824
C(27,9)=4686824个
然后考虑怎么判断能否由
L
−
R
L-R
L−R的范围内得出
开一个数组记下这个字符串的所有字符出现的个数
用L[i]表示L的第i位(从高到底,下同)。
用
g
o
(
p
o
s
,
l
f
l
a
g
,
r
f
l
a
g
)
go(pos,l_flag,r_flag)
go(pos,lflag,rflag),表示到了第
p
o
s
pos
pos位,当前获得的数字是否等于相应的
L
/
R
L/R
L/R的前缀,返回当前枚举的字符串能否构造出来。
分类讨论:
如果
p
o
s
=
=
n
pos == n
pos==n,则返回
t
r
u
e
true
true。
如果
l
−
f
l
a
g
=
=
1
l-flag == 1
l−flag==1并且
r
−
f
l
a
g
=
=
1
r-flag== 1
r−flag==1,进一步讨论:
如果
L
[
p
o
s
]
=
=
R
[
p
o
s
]
L[pos] == R[pos]
L[pos]==R[pos],则在第
p
o
s
pos
pos位只能是
L
[
p
o
s
]
L[pos]
L[pos],然后进行
g
o
(
p
o
s
+
1
,
1
,
1
)
go(pos+1, 1, 1)
go(pos+1,1,1);
如果
L
[
p
o
s
]
<
R
[
p
o
s
]
L[pos]<R[pos]
L[pos]<R[pos],那么如果可以放
[
L
[
p
o
s
]
+
1
,
R
[
p
o
s
]
−
1
]
[L[pos]+1,R[pos]-1]
[L[pos]+1,R[pos]−1]中的数字,那么一定可行;如果不可以,则尝试放
L
[
p
o
s
]
L[pos]
L[pos]并继续
g
o
(
p
o
s
+
1
,
1
,
0
)
go(pos+1,1,0)
go(pos+1,1,0)或放
R
[
p
o
s
]
R[pos]
R[pos]并继续
g
o
(
p
o
s
+
1
,
0
,
1
)
go(pos+1,0,1)
go(pos+1,0,1)。
如果
l
f
l
a
g
l_flag
lflag和
r
f
l
a
g
r_flag
rflag有且仅有一个为真,则与上面的讨论类似,先考虑把那个卡边界的弄成不卡的,如果可行直接返回真,不可行就继续卡边界继续枚举。
由于分支最多有两个,所以检验的复杂度为线性。
时间复杂度:
O
(
C
(
k
+
9
,
k
)
∗
k
)
O(C(k+9,k)*k)
O(C(k+9,k)∗k),其中k为R的十进制位数。