NOIP2017模拟赛总结(2017.11.6-2017.11.7)

2017.11.6 Problem A
题目大意: n n n个人围成一个环,编号为 1 1 1 ~ n n n,从 1 1 1号开始从 1 1 1报数,每次报到 m m m时,报 1 1 1 ~ m − 1 m-1 m1的人出列,下一个人继续报 1 1 1,问最后留下的人的编号。保证 m − 1 ∣ n − 1 m-1|n-1 m1n1
做法: 本题需要用到递归。
n n n个人进行这个游戏的话,如果就这样顺着报下去,那么剩下的就只有编号为 m m m的倍数的人和最后 n % m n\%m n%m个人,相当于把后 n % m n\%m n%m个人移到前面,然后做一个 ⌊ n / m ⌋ + n % m \lfloor n/m\rfloor+n\%m n/m+n%m个人的子问题,递归求解即可,时间复杂度约为 O ( log ⁡ m n ) O(\log_m n) O(logmn)

2017.11.6 Problem B
题目大意: 对一个 1 1 1~ n n n的排列 A A A进行一种排序,步骤是每次枚举数对 ( i , i + X ) (i,i+X) (i,i+X),如果 A i > A i + X A_i>A_{i+X} Ai>Ai+X则交换这两个数,直到没有满足要求的数对为止。问有多少种 X X X能使这个排列最后能排成升序,并求出这些 X X X n ≤ 500000 n\le 500000 n500000
做法: 本题需要用到问题转化+gcd。
注意到, A i A_i Ai能排到原来位置的充要条件是 i ≡ A i ( m o d    X ) i\equiv A_i(\mod X) iAi(modX),这意味着 X X X ∣ i − A i ∣ |i-A_i| iAi的因数,因为要满足所有这样的条件,那么我们求所有 ∣ i − A i ∣ |i-A_i| iAi的最大公因数,那么可行的 X X X就是这个最大公因数的所有因数。时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

2017.11.6 Problem C
题目大意: 一个国家有若干个城市坐落在数轴的非负整数点上,首都为 0 0 0,每个城市有一个车站,有 n n n列火车从首都开出,并到达一个目标城市 S i S_i Si,中间任意车站都可以停靠,而每列火车都有一个能容纳乘客的量 C i C_i Ci。有 m m m个乘客要乘车,第 i i i个乘客要在 L i L_i Li站上车,在 R i R_i Ri站下车,问在不超过火车容量限制的情况下,最多能满足多少名乘客的乘车需求。
做法: 本题需要用到贪心,然而我并不太会,原题应该是CQOI2016的。

2017.11.7 Problem A
题目大意: 在一个 n × n n\times n n×n的透明玻璃片上的每一个 1 × 1 1\times 1 1×1的小格涂上颜色,如果一个涂色方案使得这个玻璃片无论如何旋转、翻转,看起来都和原来一样,那么这个图被称作回文图,而现在有 m m m个小格已经被涂上了颜色,颜色共有 k k k种,问有多少种涂成回文图的涂色方案。
做法: 本题需要用到置换映射+组合计数+快速幂。
仔细分析一下,一个格子 ( x , y ) (x,y) (x,y)(坐标值均为 0 0 0~ n − 1 n-1 n1之间的数),无论经过多少次旋转、翻转操作,最后转移到的点的坐标只有 8 8 8个: ( x , y ) (x,y) (x,y), ( n − 1 − x , y ) (n-1-x,y) (n1x,y), ( x , n − 1 − y ) (x,n-1-y) (x,n1y), ( n − 1 − x , n − 1 − y ) (n-1-x,n-1-y) (n1x,n1y), ( y , x ) (y,x) (y,x), ( n − 1 − y , x ) (n-1-y,x) (n1y,x), ( y , n − 1 − x ) (y,n-1-x) (y,n1x), ( n − 1 − y , n − 1 − x ) (n-1-y,n-1-x) (n1y,n1x)。可以证明这 8 8 8个坐标经过旋转、翻转之后仍然在这 8 8 8个坐标之内,那么我们把这样的 8 8 8个坐标的集合体叫做等价类,根据回文图的定义可知,同一个等价类内的格子只能涂同一种颜色。那么问题转化为求有多少个等价类可以随便涂色,因为已经有 m m m个格子已经被涂上颜色了,那么这些格子所属的等价类也相当于被涂上颜色了, O ( m 2 ) O(m^2) O(m2)判定一下这 m m m个格子的限制使得多少等价类受到限制即可。 n × n n\times n n×n方阵中总的等价类数应该为 ⌊ n + 1 2 ⌋ ( ⌊ n + 1 2 ⌋ + 1 ) 2 \frac{\lfloor \frac{n+1}{2}\rfloor(\lfloor \frac{n+1}{2}\rfloor+1)}{2} 22n+1(2n+1+1)(这个自己想想应该就能明白了吧),用这个数减去受限制的等价类数就是能任意涂色的等价类数了,令这个数为 p p p,那么答案显然为 k p k^p kp,用快速幂求出即可,时间复杂度为 O ( m 2 + log ⁡ n 2 ) O(m^2+\log n^2) O(m2+logn2)

2017.11.7 Problem B
题目大意: 一棵树有 n n n个点,每个点可能是白色或黑色,问有多少种分割方法,使得分割后的每个连通块内有且仅有一个黑色点。
做法: 本题需要用到树形DP。
f ( i ) f(i) f(i)为在以 i i i为根的子树中切割,使得 i i i所在的连通块内不含黑色点,其余连通块都含一个黑色点的切割方案数, g ( i ) g(i) g(i)为在以 i i i为根的子树中切割,使得每个连通块内都含且仅含一个黑色点的切割方案数,那么有状态转移方程(下列 j j j表示 i i i的所有儿子):
如果点 i i i为黑色点:
f ( i ) = 0 f(i)=0 f(i)=0
g ( i ) = ∏ j ( f ( j ) + g ( j ) ) g(i)=\prod_j(f(j)+g(j)) g(i)=j(f(j)+g(j))
其中 g ( i ) g(i) g(i)的式子可理解为,对于 i i i的每一个儿子,要么选择连接 i i i与这个儿子的边,这样的话方案数为 f ( j ) f(j) f(j),要么选择断开 i i i与这个儿子的边,这样的话方案数为 g ( j ) g(j) g(j)
如果点 i i i为白色点:
f ( i ) = ∏ j ( f ( j ) + g ( j ) ) f(i)=\prod_j(f(j)+g(j)) f(i)=j(f(j)+g(j))
g ( i ) = ∑ j g ( j ) ∏ s o n ≠ j ( f ( k ) + g ( k ) ) g(i)=\sum_jg(j)\prod_{son\ne j}(f(k)+g(k)) g(i)=jg(j)son=j(f(k)+g(k))
其中 g ( i ) g(i) g(i)的式子也可写成 g ( i ) = ∑ j f ( i ) f ( j ) + g ( j ) g ( j ) g(i)=\sum_j\frac{f(i)}{f(j)+g(j)}g(j) g(i)=jf(j)+g(j)f(i)g(j),用逆元算出,然而也可以直接算上面的式子,具体计算方法见代码。
那么最后的答案显然为 g ( r o o t ) g(root) g(root),总的时间复杂度为 O ( n ) O(n) O(n)(用逆元的话会退化到 O ( n log ⁡ n ) O(n\log n) O(nlogn))。

2017.11.7 Problem C
题目大意: 一个 n n n个点 m m m条边带边权的无向连通图, q q q个询问,每次询问两点之间的最短路径长度。有 4 4 4类数据:1. n ≤ 1000 , n − 1 ≤ m ≤ 1200 n\le 1000,n-1\le m\le 1200 n1000,n1m1200。2. m = n − 1 m=n-1 m=n1。3. m = n m=n m=n。4. m > n m>n m>n,每条边最多在一个环上。
做法: 本题主要用到LCA。
对于第一类数据,暴力跑 n n n遍SPFA即可,时间复杂度约为 O ( n m ) O(nm) O(nm)
对于第二类数据,所给图为一棵树,根据 d i s ( a , b ) = d i s ( r o o t , a ) + d i s ( r o o t , b ) − 2 d i s ( r o o t , l c a ( a , b ) ) dis(a,b)=dis(root,a)+dis(root,b)-2dis(root,lca(a,b)) dis(a,b)=dis(root,a)+dis(root,b)2dis(root,lca(a,b)),在线倍增或离线Tarjan求出LCA即可,时间复杂度为 O ( ( n + q ) log ⁡ n ) O((n+q)\log n) O((n+q)logn) O ( n + q ) O(n+q) O(n+q)
对于第三类数据,所给图为一棵环套树,那么我们可以先找环,然后如果 a , b a,b a,b在同一棵外向树中,直接按照第二类求即可,否则找到它们所在外向树的根,它们之间路径的最短路就是它们各自到外向树根的距离之和+这两个根在环上的最短路。时间复杂度为 O ( ( n + q ) log ⁡ n ) O((n+q)\log n) O((n+q)logn) O ( n + q ) O(n+q) O(n+q)
对于第四类数据,所给图为一个仙人掌,然而我不会圆方树之类的奇妙数据结构,故不会做,原题应为BZOJ2125。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值