yxy小菊蒻201203总结
这是noip2020前的最后一篇总结了
这段时间连续考了很久的模拟赛 自己有几斤几两还是清楚
水平到稳定不稳定的 个别时候难免会挂分
上次 c s p csp csp 都还好 不是挂了100 是自己不想写大模拟
平常考试 T 3 , T 4 T3,T4 T3,T4 基本每天都能A一道
直观感觉是因为模拟题比正式 n o i p noip noip 简单( 别否认,否认就是你对
到时候策略还是按这暴力打吧 少点思考的时间拿去写对拍
哦对 程序一定要拍 只要考试不抓瞌睡就会有剩余时间 反正考试别太激进了
也是 就我这智商让我去想 T 4 T4 T4 正解也不太现实 ( 也就上次 c s p csp csp 敢放了 T 1 T1 T1 去冲 T 4 T4 T4 了
话说前几天我还很慌的 到现在脑子里面什么也没有了
12.1
B
逆流
不同于我们所在的世界,在颜神的世界里,时间线并不是一条直线,而是一个环。设时间线连成的环 的长度为 L,当颜神顺着时间线前进时,若跨过了第 L L L 个时刻,就会回到第 0 0 0 个时刻。反过来,若逆着 时间线前进,且跨过了第 0 0 0 个时刻,则会回到第 L L L 个时刻。在整个时间环上有 n n n 个颜神,每个颜神都是 顺着时间线或逆着时间线以相同的速度前进。若同一时刻沿着不同方向行走的两个颜神相遇,则会产生 正反物质湮灭,导致无法预料的灾难。因此若两个颜神同时位于某一个时刻(可能是小数时刻),则他们 会在该时刻同时进入反转机来改变自己的运动方向。
现在给定每个颜神所在的位置以及运动方向,请告诉管理时空的至高之神 b e g i n e n d beginend beginend, T T T 个时刻以后, 每个颜神在时间环中所在的位置。
最后每个神颜的相对位置不会变
按初始位置给神颜值排序 然后让他们开始 按各自方向前进
如果有神颜从 L L L 跨到 0 0 0 那么这个神颜一定是第 n n n 个 因为它跨过 0 0 0 了所以现在它位置最小成了第一个 剩下的 r a n k rank rank 加一
如果有神颜从 0 0 0 跨到 L L L 那么这个神颜一定是第 1 1 1 个 它跨过 L L L 之后排名变成了第 n n n 个 剩下的 r a n k rank rank 减一
然后显然就能发现规律了 好简单跳过
C
一天,羊老师在大街散步,街道两侧的每一侧都有 n n n 栋楼按顺序排成一排。现在羊老师可以从任意 一栋楼开始,以某种顺序访问每一栋楼,且每栋楼均只被恰好访问一次。羊老师每次可以走到另一侧的任 意一栋还没被访问过的楼,也可以走到同一侧两边最近的还没被访问过的楼。他想知道,有多少种不同 的访问顺序?两种访问顺序不同,当且仅当存在一栋楼在两种方案中分别是第 i 栋和第 j 栋被访问的楼, 且 i ≠ j i \neq j i=j。
举例来说,若 n = 5 n = 5 n=5,羊老师当前位于街道左侧的 3 3 3 号楼,街道左侧的 4 4 4 号楼已经被访问过,街道 右侧的楼均还未被访问,那么他下一步可以走到街道右侧的任何一栋楼,或是走到街道左侧的 2 2 2 号楼或 5 5 5 号楼。
f i , j f_{i,j} fi,j 表示当前侧有 i i i 栋 对面有 j j j 栋的答案
在有 i i i 栋的当前侧访问 k k k 栋然后到对面去的方案数是 2 k − 1 ( i − k + 1 ) 2^{k-1}(i-k+1) 2k−1(i−k+1)
所以转移方程是 f i , j = ∑ k = 1 i 2 k − 1 × ( i − k + 1 ) × f j , i − k f_{i,j}=\sum_{k=1}^{i} 2^{k-1}\times(i-k+1)\times f_{j,i-k} fi,j=∑k=1i2k−1×(i−k+1)×fj,i−k
然后就是最关键的套路 换元!
f i , j = ∑ k = 1 i 2 k − 1 ( i − k + 1 ) f j , i − k f_{i,j}=\sum_{k=1}^{i} 2^{k-1}(i-k+1) f_{j,i-k} fi,j=k=1∑i2k−1(i−k+1)fj,i−k
令 k ′ = i − k k'=i-k k′=i−k 则
f i , j = ∑ k = 0 i − 1 2 i − k + 1 ( k + 1 ) f j , k f_{i,j}=\sum_{k=0}^{i-1} 2^{i-k+1}(k+1) f_{j,k} fi,j=k=0∑i−12i−k+1(k+1)fj,k
f i , j = 2 × ∑ k = 0 i − 2 2 i − 1 − k + 1 ( k + 1 ) f j , k + i × f j , i − 1 f_{i,j}=2\times\sum_{k=0}^{i-2} 2^{i-1-k+1}(k+1) f_{j,k}+i\times f_{j,i-1} fi,j=2×k=0∑i−22i−1−k+1(k+1)fj,k+i×fj,i−1
f i , j = 2 × f i − 1 , j + i × f j , i − 1 f_{i,j}=2\times f_{i-1,j}+i\times f_{j,i-1} fi,j=2×fi−1,j+i×fj,i−1
时间复杂度 O ( n 2 ) O(n^2) O(n2)
12.2
额那套题过于简单了 没什么总结的 就是记得对拍
12.3
集合
有两堆大小分别为 n n n 的集合 A i Ai Ai , B i Bi Bi 以及一个长度为 n n n 的数列 C i Ci Ci , A i = B i = i , C i = 0 Ai=Bi={ i },Ci=0 Ai=Bi=i,Ci=0。接下来有 m m m 次操作,分为如下 5 5 5 种:
- 1 x x x y y y : 将集合 A y Ay Ay 并入集合 A x Ax Ax ,即将 A y Ay Ay 中所有元素加入 A x Ax Ax ,之后 A y Ay Ay 消失。
- 2 x x x y y y : 将集合 B y By By 并入集合 B x Bx Bx ,即将 B y By By 中所有元素加入 B x Bx Bx ,之后 B y By By 消失。
- 3 x x x t t t : 对于 A x Ax Ax 中所有的元素 i i i,令 C i Ci Ci 增加 t t t。
- 4 x x x t t t : 对于 B x Bx Bx 中所有的元素 i i i,令 C i Ci Ci 变为 t t t。
- 5 x x x : 询问 C i Ci Ci 的值。
请你对每个询问操作输出对应的结果。
思路很简单
就讲一下集合合并 集合加 还有集合合并 集合赋值 用并查集怎么做
我猜标程应该和我的想法一样 所以就略过标程了
集合合并+集合加
这个很简单 每个点上维护一个 v a l val val 满足从当前节点到并查集的根节点的 s u m sum sum 就是这个节点的答案
集合加的操作就直接在把根节点的 v a l val val 加上一个数就行了
合并集合 x x x 和 y y y 就是 v a l x = v a l x − v a l y val_x=val_x-val_y valx=valx−valy , f a t h e r x = y father_x=y fatherx=y ( 很好理解 就不细说了
路径压缩的时候把 v a l val val 改成当前节点的值减去根节点的值 然后 f a t h e r father father 指向根节点
集合合并+集合赋值
维护一个 l i n k x link_x linkx 表示如果它的父亲的值能更新 x x x 的值 那么必须满足更改父亲值的时间 > l i n k x link_x linkx
其实的 l i n k link link 就是合并两个集合的时间
可能讲不清楚 看代码把 写得挺清楚的
void findf_b(int x){ // v是这个节点的值 ti是更新这个节点的时间
if(fa[x]==x)return ;
findf_b(fa[x]);
if(ti[fa[x]]>link[x])
ti[x]=ti[fa[x]],v[x]=v[fa[x]];
link[x]=max(link[x],link[fa[x]]);
fa[x]=fa[fa[x]];
}