[省选联考 2025] 幸运数字
本来其实是没什么思想包袱的,Noip 挂了 60pts,进队难度很大,只是想发挥出自己真实水平就行。
我在 1h 的时候通过了该题的全部大样例,因为习惯使用 memset,我在大赛时似乎从来没有出过多测不清空的问题,可是这题 memset 会 TLE,于是修改了清空部分的代码,漏清了一部分,导致 100 -> 0pts。
我不理解为什么会这样,停了很久的课,却打出超烂的成绩。或许问题出在平时,常常在代码中写出搞笑错误,老是请别人帮忙调代码,甚至复制题解代码,自己很少总结,一直不改代码习惯,代码能力怎么会有进步?
可是,问题真的只有这一点吗?省选联考 2024,写了 4.5h 季风没调出来,喜提 0 + 12 + 0;THUSC 2024,写了一整场 T1 没调出来,喜提 0 + 100 + 12 + 0 参与奖。那时候我刚开始接触正规训练,打出这样糟糕的成绩,也不会太在意,只是笑笑,感觉时间还很多,一切都来得及。
也许是性格原因,我在比赛中从不写对拍,很少写非暴力部分分,因为我总是觉得对难题有思路的时候就该拼一拼,这种策略帮了我很多次,但也让我经常挂分,让我不够稳定。
今年,得知 T1 挂 0,T3 也只拿了 16pts,我没了像之前那样的心态。下个赛季就高一了,每年就一次机会,我似乎已经失去了浪费机会的资格了。也许是影响到了心情,第二天的比赛我也一直不在状态,只有 100 + 12 + 8,也不知道挂没挂,但我深知自己的这个赛季已经结束了。
看着平时一起训练的同学都取得了理想的成绩,我为他们高兴,但也失落,为什么我连 D 队线都远远摸不到。
总之,我需要好好调整一下。接下来的 3 个月肯定要好好学 whk 了,训练我应该还会参加,不过近期不会再把时间完全用在 OI 上了。
OI 生涯还剩两年,说长不长,说短不短,也许我还有机会。希望这次的“幸运数字”真的能给我的 OI 生涯带来帮助与幸运,而不只是无尽的失落与遗憾。
贴一下代码,留个纪念吧。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int c, T, n, lx[N], rx[N], ly[N], ry[N];
int cnt, b[N * 2], ans, sum[N * 2], prel[N * 2], prer[N * 2], sufl[N * 2], sufr[N * 2];
bool check(int x, int y, int z){
int m = x + y + z;
bool ok = 1;
ok &= x < (m + 1) / 2;
ok &= x + y >= (m + 1) / 2;
return ok;
}
void solve(){
cin >> n;
cnt = ans = 0;
for (int i = 1; i <= n; i++){
cin >> lx[i] >> rx[i] >> ly[i] >> ry[i];
b[++cnt] = ly[i], b[++cnt] = ry[i] + 1;
}
sort(b + 1, b + cnt + 1);
cnt = unique(b + 1, b + cnt + 1) - b - 1;
// 0pts
//for (int i = 0; i <= cnt; i++)
// prel[i] = prer[i] = sufl[i] = sufr[i] = sum[i] = 0;
// 100pts
for (int i = 0; i <= cnt + 1; i++)
prel[i] = prer[i] = sufl[i] = sufr[i] = sum[i] = 0;
for (int i = 1; i <= n; i++){
int Ly = lower_bound(b + 1, b + cnt + 1, ly[i]) - b;
int Ry = lower_bound(b + 1, b + cnt + 1, ry[i] + 1) - b;
prel[Ry] += lx[i], prer[Ry] += rx[i];
sufl[Ly] += lx[i], sufr[Ly] += rx[i];
sum[Ly] += rx[i];
}
for (int i = 1; i <= cnt; i++)
prel[i] += prel[i - 1], prer[i] += prer[i - 1], sum[i] += sum[i - 1];
for (int i = cnt; i; i--)
sufl[i] += sufl[i + 1], sufr[i] += sufr[i + 1];
for (int i = 1; i <= cnt; i++){
int xl = prel[i], xr = prer[i];
int zl = sufl[i + 1], zr = sufr[i + 1];
int mxy = sum[i] - prer[i];
if (mxy > 0){
bool ok = 0;
ok |= max(xl, zl) <= min(xr, zr);
ok |= check(xr, mxy, zl) || check(xl, mxy, zr);
ans += ok ? b[i + 1] - b[i] : 0;
}
}
cout << ans << endl;
}
signed main(){
freopen("lucky.in", "r", stdin);
freopen("lucky.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> c >> T;
while (T --> 0) solve();
return 0;
}