PKUWC2024 游记
\(\texttt{Day 0}\)
“空洞的”。
\(\texttt{Day 1}\)
早上先来每日签到。
那个人问我领队来不来,我说来,他就让我别签了。
去礼堂找到座位后,发现他们全都已经把营员证拿了,我又从礼堂尴尬出来去签到。
那个人又问我领队来不来,我直接索性不来,结果yly就在我身后。。
签完就回来听开营仪式,跟去年一模一样,无趣。
然后试机,发现签到题和去年一模一样,只是环境变成了 \(\texttt{NOI Linux}\)。结果,我在那里找了半天找到了终端,写个指令,结果写了个 \(\texttt{g++ 1.cpp -o 1; ./1.exe}\),然后什么也弄不出来,把我吓个半死,结果发现 \(\texttt{exe}\) 是来搞笑的吧。。
然后很快就出来了,然后吃完饭就休息去了。
“不是所有学校都可以从前门看到后门。”
开始力!
我们先通过惊人的记忆力把题面给留下来(原谅我记不到题目名称了):
\(\texttt{T1}\)
给你一个长度为 \(n\) 的,只包含 \(\texttt{L,R}\) 的字符串 \(a\)。
我们定义对于字符串 \(a\) 一次操作为:你可以选择一个正整数 \(i\),满足 \(1\le i \le |a|\),如果 \(a_i = R\),则操作完之后,字符串 \(a\) 就变成了 \(a_{i+1},a_{i+2},a_{|a|}\) ,否则,字符串 \(a\) 就变成了 \(a_1,a_2,a_{i-1}\)。
\(\texttt{Alice}\) 和 \(\texttt{Bob}\) 决定来玩一个游戏,\(\texttt{Alice}\) 先手,初始字符串为 \(a\)。他们轮流进行一次操作,当轮到某方无法进行操作时(即字符串为空时),则该方失败。
那么,假设二者都足够聪明。如果 \(\texttt{Alice}\) 有必胜策略,则输出 Alice
,否则输出 Bob
。
本题为多组。
样例:
输入:
3
5
LRLLR
6
RLRLRL
1
L
输出:
Alice
Bob
Alice
数据范围:
-
子任务一 \(n\le 20,t\le 50\)。
-
子任务二 \(\sum n\le 500\)。
-
子任务三 \(\sum n\le 5000\)。
-
子任务四 \(\sum n \le 10^6\)。
满分 \(100\),前三个测试点总分 \(78\)。(只记得这些了。)
\(\texttt{T2}\)
现有一个长度为 \(n-1\) 的非负整数数组 \(a\)。
定义 \(d_{i,j},1\le i \le j < n\) 表示 \(\min _{k=i}^j a_k\)。(就是 \(a\) 在 \([i,j]\) 上的最小值。)
然后,对于任意 \(1\le i \le n\),有 \(f_i=\sum_{j=1}^{i-1}d_{j,i-1}+\sum_{j=i}^{n-1}d_{i,j}\)。
现在,你知道 \(n\) 和每个 \(f_i\) 的值,让你还原 \(a\),任意一个即可。
如果无法还原则输出 \(\texttt{No}\)。
样例:
输入:
3
2 3 3
输出:
Yes
1 2
数据范围:
对于所有数据,满足 \(1\le n \le 80,0\le f_i \le 10^8\)
-
子任务一(11分) \(n\le 5\),满足特殊性质 \(A\)。
-
子任务二(15分) \(n\le 8\)
-
子任务三(24分?)\(n \le 15\)。
-
子任务四 \(n \le 20\)。
-
子任务五 \(n \le 50\),满足特殊性质 \(B\)。
-
子任务六,无特殊限制。
特殊性质 \(A\):保证存在合法的解的情况下,\(a_i\le 20\)。
特殊性质 \(B\):保证存在合法的解的情况下,\(a_i\le 50\)。
\(\texttt{T3}\)
给你一个长度为 \(2^h-1\) 的大根堆 \(a\),保证其中元素互不相同。
我们定义对堆的一次操作为:
你可以选择一个 \(i\) 满足 \(1\le i \le n,a_i\not=0\)。
然后会进行如下过程:
- \(a_i=0\)
接着,如果 \(2 \times i\le 2^h-1\) 则一直进行如下操作:
-
如果 \(a_{2\times i} < a_{2\times i+1}\),则将 \(a_{2\times i+1}\) 与 \(a_i\) 交换,并令 \(i=2\times i+1\)。
-
否则,则将 \(a_{2\times i}\) 与 \(a_i\) 交换,并令 \(i=2\times i\)。
然后,我们定义两个集合 \(s_1,s_2\),初始为空。
接下来进行 \(q\) 次操作:
-
\(1,x,y(y\in\{1,2\},1\le x\le 2^h-1)\),即将 \(x\) 加入 \(s_y\) 集合,保证现在 \(x\notin s_y\)。
-
\(2,x,y(y\in\{1,2\},1\le x\le 2^h-1)\),即将 \(x\) 从 \(s_y\) 集合中删除,保证现在 \(x\in s_y\)。
-
\(3,x,z(1\le x \le 2^h-1,1\le z \le 10^6)\)。求有多少个 \(S\) 满足,\(s_1\subset S\subset (s_2\cup s_1)\),以及对最初给定的堆进行若干次操作之后,满足以下几个条件:
-
\(A\):对于任意 \(i\in S\),\(a_i\not=0\)。
-
\(B\):在满足 \(A\) 的前提下,使得 \(\sum_{i=1}^{2^h-1}a_i\times i\) 最小。可以证明存在唯一性。
-
\(C\):在满足 \(B\) 的前提下,\(a_x=z\)。
由于满足条件的 \(S\) 可能过多,所以输出对 \(10^9+7\) 取模。
样例:
输入:
2
3 2 1
11
1 1 2
1 2 2
1 3 2
3 1 3
3 1 2
3 1 1
2 1 2
1 1 1
3 1 3
3 1 2
3 1 1
输出:
4
2
1
2
1
1
数据范围
-
子任务一(10分),\(h\le 2,q\le 50\)。
-
子任务二(10分),\(h\le 5,q\le 500\)。
-
子任务三(20分),\(h\le 9,q\le 5000\),且在1和2操作中,\(y=1\)。
-
子任务四(20分),\(h\le 9,q\le 5000\)。
-
子任务五?
-
子任务六?
对于全部数据,满足 \(a_i \le 10^6,h\le 18,q\le 10^5\)。
自己都被这惊人的记忆力震惊了。
然后吧,T1乱搞了一个应该可以被卡到 \(n\sqrt{n}\) 的做法,最开始T了,以为是真挂了,所以就没管了。
然后,去看T2,觉得可以打一个全排列和高斯消元先骗前面的26,结果发现高斯消元遇到自由元根本造不出来特殊解,于是浪费2.5h,只过了子任务一。
T3我是真服了,原题题面长的跟个什么一样,读了半天终于读懂,打了暴力就跑了,结果忘记看特殊性质。。
T3搞完回来之后,觉得T1可能会人均过,所以赶快回去看了一眼,发现是数组开小了,而不是他真T了。哈哈哈,原来学科营也有数据水的一天,
出来,仔细想了想,好像T1那个做法可以严格证明是 \(n\log n\) 的,结果发现他们全打的 \(O(n)\) 做法,被吊打了。
王博神比最后一题我多骗一个特殊性质,这简直跟去年一模一样,连多的分都一模一样。
感觉 \(\texttt{Day1}\) 大家都这么多分,还是得看 \(\texttt{day2}\) 的发挥。
\(\texttt{Day 2}\)
早上是讲座,有关语言种类和优缺点方面,感觉挺有意思,激发了我学习其他语言的欲望(
中午很早就出校了,然后就是吃饭睡觉,没啥好说。
下午,开始力!
我们再次留下题面:
\(\texttt{T1:圆}\)
给你一个拥有 \(n\) 个元素的可重集 \(\texttt{S}\)。最初,每个元素 \(a\) 都是一个一位小数。
然后,你可以对 \(\texttt{S}\) 进行如下操作之一,直到 \(|S|=1\):
-
删除其中的一个数 \(x\),并将其四舍五入之后重新放入 \(S\)。
-
删除其中的两个数 \(x,y\),并将 \(x+y\) 重新放入 \(S\)。
操作完毕后,得到的结果是 \(S\) 中剩余元素四舍五入的值。
求如何进行操作,使得得到的结果最大。
本题为多组输入。
样例:
输入:
2
2
4.4 5.4
6
0.4 0.3 7.3 4.3 5.3 0.3
输出:
10
19
数据范围
\(1\le n \le 10^6\),\(\sum n \le 10^6\),\(0\le a \le 10\)。
\(\texttt{T2:排序}\)
给你 \(m\) 个数,第 \(i\) 个数为 \(d_i\)。
对于一个数组 \(a_{0,1,n-1}\), 我们可以进行一次 \(\texttt{shell sort}\),即进行如下代码:(与考场上有一定差异,但是保证意思相同):
int t, swap_count;
void insert_sort(vector<int> &v) {
int n = v.size();
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if(v[j] < v[j - 1]) {
swap(v[j], v[j - 1]);
swap_count++;
}
}
}
}
void init() {
for (int i = 0; i < t; ++i) {
vector<int> v;
for (int j = i; j < n; j += i) v.push_back(a[j]);
insert_sort(v);
for (int j = i, k = 0; j < n; j += i, ++k) a[j] = v[k];
}
}
void shell_sort() {
swap_count = 0;
for (int i = 1; i <= m; ++i) {
t = d[i];
init();
}
}
然后,现在给你一个正整数 \(n\),要求你对所有 \(n\) 的排列均进行上述操作,让你求操作结束后,\(\texttt{swap\_count}\) 的最大值,和有多少个排列能够达到这个最大值。后者对 \(10^9+7\) 取模。
样例:
输入:
5 2
2 1
输出:
7 2
数据范围
\(1\le n \le 30\),\(1\le m \le 10\),对于任意 \(i,1\le i< m\),有 \(d_i>d_{i+1}\),且 \(d_m=1\)。
\(\texttt{T3:栈}\)
初始时,你有 \(n\) 个空栈。
接下来进行 \(q\) 次操作:
-
\(1,l,r,x,y\),将 \([l,r]\) 这一段的栈中,向栈顶加入 \(x\) 个 \(y\)。
-
\(2,l,r,z\),将 \([l,r]\) 这一段的栈中,从栈顶开始,一直弹 \(z\) 个元素,如果这个栈中元素不超过 \(z\) 个,那就直接弹空。
-
\(3,x,y,z\),求 \(x\) 这个栈中的从栈底开始的第 \(y\) 个元素到第 \(z\) 个元素的元素和,如果没有第 \(i\) 个元素,那么就假定这个元素为 \(0\)。
数据范围
\(1\le n,q\le 10^5\)。
对不起,过去一天了,记忆力实在不太好。
T1一眼贪心,讨论一下 \(0.1\) 和 \(0.2\) 的构造即可。
T2先打全排列暴力,然后骗 \(m=2\)。
T3也就是一个一个特殊性质拿,可惜有一个没拿到,不然就310+。
出来之后,直接去问神王博多少分,MD比我少骗了一个特殊性质,但是Day1那个特殊性质的分比Day2的多 \(4\) 分。艹。
其他几个人感觉考的不太好,有个初二的就比我低 \(20\),感觉这把废大。
昨天GM让我复习概率期望,而我没认真复习,原因是我赌今天不考。哈哈哈,我赌对了,但是没什么用。
怎么办啊,这届初三清华营也考的跟个什么一样,废啦哈哈哈,继续努力吧。