比赛-一场训练赛

1218, pcy333 和 skywalker 的互测题

题目 源文件 空间限制 时间限制
A. 邪恶的戳戳 evil.cpp 256M 2s
B. 顽皮的仙童 naughty.cpp 128M 2s
C. 先知和圣骑士 paladin.cpp 8M 2s

使用 Lemon 在 Linux 下评测,不开启 O2 优化


A. 邪恶的戳戳

(evil.cpp/pas, 256M, 2s)

题目背景

凤九小殿下被邪恶的戳戳抓走了!

题目描述

邪恶的戳戳掌管着 (n) 个城市,每一个城市都有一栋关押人的房子。邪恶的戳戳为了不让其他人轻易的找到他所关押的的人,每一天早上都会将每一个城市中所关押的人转移到另外一个指定的城市。帝君为了找到自己心爱的凤九小殿下,他需要知道凤九小殿下所在的城市。

帝君依靠他强大的1433223系统(取不出名字了,【滑稽】),已经知道了邪恶的戳戳每一个城市所关押的人第二天早上将会被送到哪一个城市。

他现在想要知道,如果凤九小殿下第一天被关在城市 (c) ,那么第 (k) 天的时候凤九小殿下将会被关押在哪一个城市。

这么重要的任务当然得交给聪明的你了!

输入格式:

第一行两个整数 (n, m)(n) 表示邪恶的戳戳掌管了 (n) 个城市, (m) 表示有 (m) 个询问。

第二行 (n) 个整数    第 (i) 个数 (A_i) 表示 (i) 号城市的被关押人第二天早上将会被转移到的城市。

接下来 (m) 行,每行两个整数 (c, k)   表示第一天凤九小殿下被关在 (c) 号城市,询问第 (k) 天凤九小殿下所在的城市。

输出格式:

(m) 行,第 (i) 行表示第 (i) 个询问的答案

样例输入1

5 3
2 3 4 5 1
1 3
5 2
3 7

样例输出1

3
1
4

样例输入2

10 6
4 3 8 6 1 5 3 7 10 9
1 8
2 7
9 3
8 15
5 10
2 3

样例输出2

5
7
9
3
1
8

数据范围:

对于30%的数据  保证n,m,k<=2000

对于100%的数据 n,m<=500000 , 1<=Ai<=n , 1<=k<=1e16


B. 顽皮的仙童

(naughty.cpp/pas, 128M, 2s)

题目背景

八荒四海,九州六合,即便最尊贵之人,亦有最平凡的恼。

题目描述

CY上仙居住的仙宫之外种植了n棵仙树,n棵仙树从1到n顺时针围成一圈,结满了仙果。每一棵仙树均有一个茂盛值ai与魔力值bi。其魔力值的定义方式十分特别——第i棵仙树的魔力值bi等于以i为端点且ai为区间内仙树茂盛值的最小值的最长区间长度(要求区间长度小于n)。

CY上仙还收养了m个顽皮的小仙童,每个小仙童都有一个顽皮值ci。这一天他们又闯了祸,竟然集体偷吃仙果,CY上仙把他们排好了队要好好教育他们。CY上仙事务繁忙,于是想起六十一万年前在人间习得的分块思想,决定将仙童分成若干组教育,这样他就只用教育每组排在最后的仙童,然后安排这些仙童教育组里的其他仙童(仙童编号顺序不可调换,每组内的仙童必须编号连续,一个仙童仅属于一个组)。然而每个仙童的教育能力有限,教育的仙童数不能超过自己所吃仙果的仙树的魔力值。CY上仙想让他亲自教育的仙童顽皮值之和最小,请帮CY上仙安排得明明白白!

输入格式

第一行,两个整数n,m。

第二行,n个空格隔开的整数,第i个数表示第i棵仙树的茂盛值

第三行,m个空格隔开的整数,第i个数表示第i个仙童的顽皮值

第四行,m个空格隔开的整数,第i个数表示第i个仙童所偷吃的仙树的编号

输出格式

一个整数,表示上仙亲自教育的仙童的顽皮值之和的最小值

样例输入一

3 3
1 1 1
5 5 5
1 2 3

样例输出一

5

样例输入二

8 5
8 9 8 1 1 4 5 2
3 4 9 6 5
2 4 1 6 7

样例输出二

14

数据范围

对于30%的数据, n,m<=2000

对于另40%的数据,n,m<=200000

对于另30%的数据,n,m<=3000000,保证仙童所吃仙果的魔力值单调不上升

对于100%的数据,ai,ci<=10^9


C. 先知和圣骑士

(paladin.cpp/pas, 8M, 2s)

Description

因为数据结构学得太差,出题人非常担心自己不能编出一道适合大家(足够毒瘤)的 C 题,所以邀请另一位出题人颓废地开了一把魔兽。

skywalker 操纵的先知对 1218 操纵的圣骑士展开了攻击。游戏中有三种魔法技能:

【心灵之火】:每秒受到的伤害减为 (frac{1}{p_i})

【死亡献祭】:每秒增加 (a_i) 点伤害。

【神圣护甲】:每秒受到的伤害向下取整。

skywalker 操纵的先知会连续对 1218 操纵的圣骑士进行 (n) 次攻击。第 (i) 次攻击持续 (t_i) 秒(第 (t_i) 秒和第 (0) 秒也会进行攻击),第 (0) 秒的攻击力是 (b_i) 。圣骑士在一次攻击中受到的总伤害值 (x_i) 等于这次攻击中每秒受到的伤害值的和。

圣骑士拥有【神圣护甲】,先知拥有【死亡献祭】。游戏开始后,1218 立即用牧师给自己操纵的圣骑士施放了【心灵之火】。接着先知就开始对圣骑士进行攻击。【心灵之火】的技能参数 (p_i) 并不是固定的,而是在某个范围内随机取值。因此,圣骑士受到的伤害值 (x_i) 也不是固定的,而是一个期望值。具体地, (p_i in N^* cap [L_i, R_i])

1218 经常意识模糊,他随口说出了一个包含 (n) 个数的数列 (y_i) ,并给出了一个数 (d) ,然后定义了一个没有什么实际意义的估价函数

[g(n) = sum_{i=1}^{n}sum_{j=1}^{i} d^{2i+j} cdot (2j+i) cdot (x_i+y_j)​ ]

来决定这局游戏的价值。同时,他还提出了 (T) 次询问。第 (i) 次询问在 (x_l,x_{l+1},...,x_{r-1},x_r) 这些数都增大 (s_i) 的情况下, 即 (x_i'=x_i+s_i) 时,把 (x_i') 作为 (x_i) 代入 (g(n)) 后函数的值。所有答案对 (998244353) 取模。

Input

第一行 (3) 个整数 (T, d, n)

接下来 (6) 行,每行 (n) 个整数,第 (i) 个数分别表示 (L_i, R_i, t_i, a_i, b_i, y_i)

接下来 (T) 行,每行 (3) 个整数 (l, r, s_i)

对于 (100\%) 的数据,满足 (L_i le R_i, |R-L| le 10, 1 le l le r le n) 。实际评测数据中不包含样例数据。

测试点编号 (n) (T) (L,R) (t) (d,a,b,y,s)
1 (100) (10) ([1,4 imes 10^4]) ([1, 4 imes 10^4]) ([1,10^9])
2 (100) (10) ([1,4 imes 10^4]) ([1,4 imes 10^4]) ([1,10^9])
3 (5 imes 10^4) (10^6) ([1,4 imes 10^4]) (5) ([1,10^9])
4 (5 imes 10^4) (10^6) ([1,4 imes 10^4]) (5) ([1,10^9])
5 (5 imes 10^4) (5) ([1,10^9]) ([1,5 imes 10^5]) ([1,10^9])
6 (5 imes 10^4) (5) ([1,10^9]) ([1,5 imes 10^5]) ([1,10^9])
7 (5 imes 10^4) (10^6) ([1,10^9]) ([1,5 imes 10^5]) ([1,10^9])
8 (5 imes 10^4) (10^6) ([1,10^9]) ([1,5 imes 10^5]) ([1,10^9])
9 (5 imes 10^4) (10^6) ([1,10^9]) ([1,5 imes 10^5]) ([1,10^9])
10 (5 imes 10^4) (10^6) (1) ([1,5 imes 10^5]) ([1, 10^9])

Output

输出 (T) 行,每行一个整数,表示每次询问的答案。

Sample Input

6 31 6
5 1 5 3 3 4
6 6 6 6 6 6
21063 17619 12248 2107 20074 31434
29204 27494 9358 431 10419 12256
16217 5342 28593 22408 22465 3528
28104 5371 8573 11929 1161 2906
5 6 25
2 6 15181
2 6 18128
1 6 16711
5 6 21358
4 6 18700

Sample Output

602577786
311253160
782751886
761016307
532152973
603661540

Note

  • 先知第 (i) 次攻击在第 (k) 秒的攻击力是 (v_k=b_i+ka_i) 。由于圣骑士拥有【心灵之火】,他受到的伤害减为 (v_k=frac{b_i+ka_i}{p_i}) 。又由于圣骑士还拥有【神圣护甲】,他受到的伤害最终将变为 (v_k'=lfloor v_k floor)
  • (lfloor x floor) 表示向下取整,即表示满足 (x' le x) 的最大整数 (x')
  • 乘法和加法均满足模意义下的分配律,即: ((a+b) mod c = ((a mod c)+(b mod c)) mod c)((a cdot b) mod c = ((a mod c) cdot (b mod c)) mod c)
  • 请注意输入输出以及取模运算对程序运行时间的影响。

C题题解

测试点解释:

1,2 测试点是给纯暴力算法;

3,4 测试点是给前缀和算法;

5,6 测试点是给类欧算法;

7,8,9 测试点是给正解;

10 测试点是给在处理出前缀和的同时,观察到向下取整和式分母是 (1) 时分子只是一个等差以及等比数列求和,从而不需要类欧就可以处理出 (x_i) 的算法。

也就是说 1,2,3,4,10 这 50 分是可以不用扩欧拿的。


观察题目,大概是两个子问题,求 (x_i) 和回答关于 (g(n)) 的询问。


(x_i) 。是一个裸的类欧,和期望并没有关系。

枚举 (p in [L,R]) ,设 (z = sum_{k=0}^{t} lfloor frac{b+ka}{p} floor) ,则 (x = frac{sum z}{R-L+1})

观察每次求 (z) 的和式 (z = sum_{k=0}^{t} lfloor frac{b+ka}{p} floor)

(b_i ge p_i)(a_i ge p_i) 时,可以把 (a_i,b_i) 中能整除的部分处理到取整符号外面去。

[z = ... = f(a,b,p,t) = f(a mod p, b mod p,p,t)+ frac{n(n+1)}{2} cdot lfloor frac{a}{p} floor+(n+1)lfloor frac{b}{p} floor ]

这样就能得到一个 (b_i < p_i)(a_i < p_i) 的和式。

(n=lfloor frac {b+ta}{p} floor) ,则可以变形为:

[z = sum_{k=0}^{t} lfloor frac{b+ka}{p} floor = sum_{k=0}^{t} sum_{l=1}^{n} left[ lfloor frac{b+ka}{p} ge l floor ight] ]

然后胡乱搞一下:

[z = sum_{k=0}^{t} sum_{l=0}^{n-1} left[ k > frac{lp+p-b-1}{a} ight] = sum_{l=0}^{n-1} left( t-frac{lp+p-b-1}{a} ight) ]

其实右边最后减去的那个式子就是 (f(p,p-b-1,a,n-1))

[f(a,b,p,t) = nt - f(p,p-b-1,a,n-1) ]

观察参数一、三的变化,其实就是欧几里得的变化过程。欧几里得的时间复杂度由于每次至少折半,所以是 (O(log n))

这个 (z = sum_{k=0}^{t} lfloor frac{b+ka}{p} floor) 是最裸的类欧。另外,类欧常见可以处理的还有两个和式:

[sum_{k=0}^{n} lfloor frac{b+ka}{p} floor cdot i ]

[sum_{k=0}^{n} {lfloor frac{b+ka}{p} floor}^2 ]

请大家愿意的话自己看看吧(我都不会)。丢个链接再跑。

类欧几里得算法的推导_WorldWide_D


(g(n)) 。拆开式子,记录 (x_i) 的系数。用几个前缀和维护即可。每次询问是 (O(1)) 的。

原文地址:https://www.cnblogs.com/ghcred/p/9524764.html