Noip 模拟 15 2018/11/2

T1:独木桥 (bridge)
Alice 和 Bob 是好朋友,这天他们带了 n 个孩子一起走独木桥。
独木桥宽度很窄,不允许两个或两个以上的人并肩行走,所有人必须要前后一个接一个地通行。
Bob 给所有的孩子蒙上了眼,并将他们放在桥中不同的位置上,孩子们初始的朝向不一定相同。Bob 吹响哨声后这些孩子们会按照初始的朝向开始移动,当两个孩子移动到同一点时由于桥太窄他们无法穿过彼此,因此他们会同时转身改变朝向,并接着朝新方向移动。
为了安全起见,在某个时刻 Alice 会询问 Bob 某个孩子现在所处的位置。
更具体的,我们可以将问题抽象如下:
· 将独木桥看作一个长度无限长的实数轴,将每个孩子看作数轴上的一个实数点。数轴从左到右坐标不断增大。
· 孩子的位置用相对于数轴原点的点的坐标来表示。初始时 n 个点在 n 个互不相同的整点上。
· 每个点有一个初始朝向 (从左向右或从右向左)。任何时刻所有的点都会以每秒 1 单位长度的速度匀速向所朝的方向移动。当某个时刻两个点同时移动到了同一个位置上,它们会立即改变自己的朝向 (从左向右变成从右向左,反之亦然),然后继续移动。
· 有 q 次询问,每次询问给定 ki 与 ti,询问在 ti 秒后,孩子 ki 目前的位置。
Bob 无法同时关注这么多的孩子,请你帮帮他。

一眼蚂蚁
考虑蚂蚁的性质,灵魂交换,即蚂蚁间的相对位置不变,位置即为原方向走的距离
那么将两种方向的蚂蚁分别拎出来,即为两个有序数列
那么转化为两个有序数列分别加上 p p p 之后第 k k k 大的点是什么
考虑二分位置,即可在 log ⁡ n \log{n} logn 的时间内分别求出在两个有序数列中有几个比他小的,找到比他小的个数恰好为 k k k 就行了

T2:交通 (traffic)
格丁尼亚的中心位于 Kacza 河中的一座岛屿。每天清晨,成千上万辆汽车通过岛屿从西岸的住宅区 (由桥连接岛的西部)到东岸的工业区(由桥连接岛的东部)。
该岛类似于矩形,它的边平行于主方向。故可将它看作是笛卡尔坐标系中的一个 A
B 的矩形,它的对角分别为(0, 0)和(A, B)。 岛上有 n 个交通节点,编号为 1…n(junction, 此处可理解为广义的路口),第 i 个节点坐标为 (xi, yi)。 如果一个节点的坐标为 (0, y),它就位于岛的西岸。类似的,坐标为 (A, y) 的节点位于岛的东岸。 各个节点由街道连接,每条街道用线段连接两个节点。街道有单向行驶或双向行驶之分。除端点外任意两条街道都没有公共点。也没有桥梁或者隧道。 你不能对道路网络形状做任何其他假设。沿河岸的街道或节点可能没有入口或者出口街道。
由于交通堵塞日趋严重,市长聘请你测试岛上当前的道路网是否足够。要求你写一个程序确定从岛的西岸的每个节点能够到达东岸的多少个节点。*

因为任意两条街道都没有公共点,可以发现一个西侧的点到东侧一定是一段连续的区间(扣除不可到达的点)(虽然我没有发现
那么答案就为可以到达的 max ⁡ − min ⁡ + 1 \max-\min+1 maxmin+1
然后想到 dp,dfs 存 max ⁡ \max max min ⁡ \min min
但是有强连通分量,会死循
那么就用 Tarjan 缩点重建图即可

T3:
有一位流浪者正在一个 n∗m 的网格图上流浪。初始时流浪者拥有 S 点体力值。
流浪者会从 (1,1) 走向 (n,m), 并且他只会向下走 ((x,y)→(x+1,y)) 或是往右走 ((x,y)→(x,y+1)), 在所有可行的路线中他会随机选择一条。
网络图中还有 K 个障碍点。若流浪者当前体力值为 S,则他经过一个障碍点后体力值会变为 ⌈S2⌉。
现在请你求出,流浪者到达 (n,m) 时他体力值的期望是多少。
若答案为 a b \frac{a}{b} ba, 则你输出 a b \frac{a}{b} ba 在模 1 0 9 + 7 10^9+7 109+7 意义下的值即可。

巧妙的 dp
可以发现,一个 S S S 值在 / 20 /20 /20 以上之后都是 1
那么就只要处理出前 20 20 20 个经过特殊点的情况
f [ i ] [ j ] f[i][j] f[i][j] 表示第 i i i 个特殊点,经过特殊点的次数为 j j j 的方案数(特殊点按时(X,Y)排序)
f [ i ] [ j ] = w a y ( ( 1 , 1 ) − > ( x [ i ] , y [ i ] ) ) − f [ i ] [ j − 1 ] − ∑ k = 1 i − 1 f [ k ] [ j ] f[i][j]=way((1,1)->(x[i],y[i]))-f[i][j-1]-\sum_{k=1}^{i-1}f[k][j] f[i][j]=way((1,1)>(x[i],y[i]))f[i][j1]k=1i1f[k][j] ( w a y way way 为从 ( x 1 , y 1 ) (x1,y1) (x1,y1) ( x 2 , y 2 ) (x2,y2) (x2,y2) 的方案数)
处理时将 ( n , m ) (n,m) (nm) 也作为特殊点, a n s = ∑ i = 1 l e n f [ K + 1 ] [ i ] ans=\sum_{i=1}^{len}f[K+1][i] ans=i=1lenf[K+1][i] ( l e n len len 为前 l e n len len s / 2 ! = 1 s/2!=1 s/2!=1)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值