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:骗到了自己能力范围内所有的分。可喜可贺。
posted @ 2024-07-04 16:31  cqbzlym  阅读(26)  评论(0)    收藏  举报