qwq
上午:J 组
T1
人均 \(\mathcal O(1)\) 就我 \(\log\) 🥴
思路是,跑一个快速幂,中间运算大于 \(10^9\) 的时候就停。
用时 5min,预计分数 100pts。
T2
人均 \(\mathcal O(1)\) 就我 \(\log\) 梅开二度了属于是。
容易发现问题可化为,已知 \(x+y\) 与 \(x\times y\),求 \(x\) 和 \(y\)。
赛时想了很久什么思路都没有,直接根据和一定差小只因大的小学口诀二分 \(x\)。数据范围给得很良心,\(\log\) 可过,可喜可贺。
用时 15min,预计分数 100pts。
一些闲话
考后告诉王森,J 组考了数学题,而且我没想到数学方法。
王森很幽怨(?)地盯着我看了一会儿,然后问我:「这个不是可以知二求二吗?」
然后我愣住了。王森继续很幽怨地看着我:「也可以用韦达定理啊?」
最后王森还是很幽怨地看着我:「你数学周考卷子改错了吗?」
答案当然是没有的。然后我就被王森一脚踹出办公室了。
T3
一开始很固执的认为,这个东西只有两种符号,应该用不着中缀转后缀。
然后就寄了,死活过不了样例。在还剩半个小时的时候恍然醒悟:哦,好像用不用中缀转后缀和它有几种运算符没有关系……
然后就开始摆烂。
用时 2h30min,预期得分 0pts。
T4
一眼秒了,什么 DP 水题。
其实想到 2020 年 J 组 T4 的小清新简单 DP 把当时的我整自闭了,现在这种水平的小 DP 已经可以一眼秒了,还是挺感慨的。
用时 15min,预计得分 100pts。
浅浅说一下暴露的问题吧。
- T1 & T2:数学烂,反应慢,当然这是王森需要管的。
- T3:固执己见(?),在同一种方法上碰壁太多次不懂得停下来审视自己的思路。
- T3:没有及时止损,哪怕骗骗分也好呢,起码不要挂成 0 分吧。
当然也有优点:
- T1 & T2:没有正常思路的时候可以迅速想到一些不正常的正确思路。值得表扬。
- T3:很有毅力(大雾
- T4:套路题可以一眼秒,可以一遍过大样例(自豪)。
下午:S 组
T1
很明显地是一道 Meet in the middle,赛时也在打完暴力过后迅速看出来了。值得表扬。
但是其他部分都打好了,很完美的 \(n^2\),但是我不知道怎么 \(n^2\) 合并搜索状态……
吸取了 J 组 T3 的教训,决定多骗点分,使用了最劣复杂度 \(n^4\) 的玄学搜索剪枝,开 O2 本地 \(n=300\) 的大样例要跑 5s,但是在洛谷、InfOJ、小图灵、计蒜客上面跑出来都是 70pts 🥴
UPD:破案了,因为加了剪枝,所以 \(k=0\) 的数据跑得飞快,所以 70pts 稳。
预期得分 40pts,民间数据得分 70pts。
T2
很优秀的大分讨。并且十分一眼。
所以我们暴力讨论 A 和 B 包含的数的正负性,分别为全正、全负、有正有负,乘法原理可得,共有 \(3\times 3=9\) 种情况。
迅速注意到区间包含的数的正负性可以用 RMQ 解决。用四个 ST 表就好。
然后最难以判断的是 A 有正有负,B 也有正有负的情况,我们再开两个 ST 表,记录 A 中大于 \(0\) 的最小的数和小于 \(0\) 的最大的数就好了。因为这不是题解,所以不细讲。
丢一下赛时代码。
/* * 今天是 10 月 29 日
* 是 枫原万叶 的生日
* 生日快乐,万叶!
* 跟所有的烦恼说拜拜,跟所有的快乐说嗨嗨(划掉
* 同时,今天也是巫恋小姐和我们同机房的伙伴 JZB 的生日
* 祝他们所有人生日快乐 XD
*/
#include <bits/stdc++.h>
using ll = long long;
namespace fastIO {
const int LEN = (1 << 20);
inline int nec(void) {
static char buf[LEN], *p = buf, *e = buf;
if (p == e) {
e = buf + fread(buf, 1, LEN, stdin);
if (e == buf)
return EOF;
p = buf;
}
return *p++;
}
inline bool read(int &x) {
x = 0;
bool f = 0;
char ch = nec();
while (ch < '0' || ch > '9') {
if (ch == EOF)
return 0;
if (ch == '-')
f = 1;
ch = nec();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = nec();
}
if (f)
x = -x;
return 1;
}
void print(ll x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x >= 10)
print(x / 10);
putchar(x % 10 + '0');
return;
}
inline void print(ll x, char ch) {
print(x);
putchar(ch);
return;
}
} // namespace fastIO
namespace XSC062 {
// 这,,???
using namespace fastIO;
const int maxm = 19;
const int inf = 2e9;
const int maxn = 1e5 + 5;
int cnt[maxn];
int t[maxn][maxm][2];
int f[2][maxn][maxm][2];
int n, m, q, l1, r1, l2, r2, k;
int al, ar, bl, br, a0, tal, tar, tbl, tbr;
inline int min(int x, int y) {
return x < y ? x : y;
}
inline ll max(ll x, ll y) {
return x > y ? x : y;
}
inline bool lef(int l, int r) {
return r < 0;
}
inline bool mid(int l, int r) {
return l < 0 && r >= 0;
}
inline bool rig(int l, int r) {
return l >= 0;
}
int main() {
read(n), read(m), read(q);
for (int i = 1; i <= n; ++i) {
read(f[0][i][0][0]);
f[0][i][0][1] = f[0][i][0][0];
cnt[i] = cnt[i - 1] + (f[0][i][0][0] == 0);
if (f[0][i][0][0] > 0) {
t[i][0][0] = f[0][i][0][0];
t[i][0][1] = -inf;
}
else if (f[0][i][0][0] < 0) {
t[i][0][1] = f[0][i][0][0];
t[i][0][0] = inf;
}
else t[i][0][0] = inf, t[i][0][1] = inf;
}
for (int i = 1; i <= m; ++i) {
read(f[1][i][0][0]);
f[1][i][0][1] = f[1][i][0][0];
}
for (int j = 1; (1 << j) <= n; ++j) {
for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
f[0][i][j][0] = min(f[0][i][j - 1][0],
f[0][i + (1 << (j - 1))]
[j - 1][0]);
t[i][j][0] = min(t[i][j - 1][0],
t[i + (1 << (j - 1))]
[j - 1][0]);
f[0][i][j][1] = max(f[0][i][j - 1][1],
f[0][i + (1 << (j - 1))]
[j - 1][1]);
t[i][j][1] = max(t[i][j - 1][1],
t[i + (1 << (j - 1))]
[j - 1][1]);
}
}
for (int j = 1; (1 << j) <= m; ++j) {
for (int i = 1; i + (1 << j) - 1 <= m; ++i) {
f[1][i][j][0] = min(f[1][i][j - 1][0],
f[1][i + (1 << (j - 1))]
[j - 1][0]);
f[1][i][j][1] = max(f[1][i][j - 1][1],
f[1][i + (1 << (j - 1))]
[j - 1][1]);
}
}
while (q--) {
read(l1), read(r1);
read(l2), read(r2);
k = log(r1 - l1 + 1.0) / log(2.0);
al = min(f[0][l1][k][0],
f[0][r1 - (1 << k) + 1][k][0]);
ar = max(f[0][l1][k][1],
f[0][r1 - (1 << k) + 1][k][1]);
k = log(r2 - l2 + 1.0) / log(2.0);
bl = min(f[1][l2][k][0],
f[1][r2 - (1 << k) + 1][k][0]);
br = max(f[1][l2][k][1],
f[1][r2 - (1 << k) + 1][k][1]);
a0 = cnt[r1] - cnt[l1 - 1];
if (mid(al, ar) && mid(bl, br)) {
// 如果是可以避免的战斗……
if (a0) print(0, '\n');
// 那就保持沉默。
else {
k = log(r1 - l1 + 1.0) / log(2.0);
tal = min(t[l1][k][0],
t[r1 - (1 << k) + 1][k][0]);
tar = max(t[l1][k][1],
t[r1 - (1 << k) + 1][k][1]);
k = log(r2 - l2 + 1.0) / log(2.0);
print(max((1ll * tal) * bl,
(1ll * tar) * br), '\n');
}
}
else if (lef(al, ar) && mid(bl, br))
print((1ll * ar) * br, '\n');
else if (rig(al, ar) && mid(bl, br))
print((1ll * al) * bl, '\n');
else if (mid(al, ar) && lef(bl, br))
print((1ll * al) * br, '\n');
else if (lef(al, ar) && lef(bl, br))
print((1ll * al) * br, '\n');
else if (rig(al, ar) && lef(bl, br))
print((1ll * al) * bl, '\n');
else if (mid(al, ar) && rig(bl, br))
print((1ll * ar) * bl, '\n');
else if (lef(al, ar) && rig(bl, br))
print((1ll * ar) * br, '\n');
else print((1ll * ar) * bl, '\n');
}
return 0;
}
} // namespace XSC062
int main() {
XSC062::main();
return 0;
}
期望得分:100pts,民间数据得分:100pts。
T3
40 分暴力,爬了爬了。
T4
44 分暴力,爬了爬了。
暴露出的问题:
- T1:太菜了。想不到合并方法。就算下来问了问 AK 巨佬 Cindy 也没听懂。
- T3 & T4:太菜了。不会。
展示出的优点:
- T1:优秀的骗分。得分大大超出预期。
- T2:细节处理得很到位,没有出锅。
- T3 & T4:骗到了自己能力范围内所有的分。可喜可贺。
—— · EOF · ——
真的什么也不剩啦 😖

浙公网安备 33010602011771号