Noip 模拟 5 2018/10/22

T1:南州(south)
在那美丽的南州,有一个美丽的砚池,池边有一圈美丽的花,一共有 n n n朵。
某一天,有 n ∗ m n∗m nm个人去给池边的花施肥,他们每人拿了一袋肥料。但这 n n n朵花中有一朵特立独行的花,它只能接受某种特殊的肥料,这 n ∗ m n∗m nm个人中有 m m m个人拿了这种特殊的肥料。
这些人排成一队,按照一种奇怪的方式来给花施肥。
排头给当前的花施肥然后离开,然后开头的 p p p个人走到最后,再把顺时针的下一朵花设定为当前花,重复以上操作,直到所有人都离开。
初始时把特立独行的花的顺时针下一朵花设定为当前花。
这些人希望特殊的肥料能够全施到特立独行的花上。
拿了特殊肥料 m m m个人应该排在初始队伍的哪些位置,才能达成目标呢?

由于 n ∗ m &lt; = 1 e 6 n*m&lt;=1e6 nm<=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 LR的范围内得出
开一个数组记下这个字符串的所有字符出现的个数
用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) goposlflagrflag,表示到了第 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 lflag==1并且 r − f l a g = = 1 r-flag== 1 rflag==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 ] &lt; R [ p o s ] L[pos]&lt;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的十进制位数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值