[省选联考 2025] 幸运数字

· · 生活·游记

本来其实是没什么思想包袱的,Noip 挂了 60pts,进队难度很大,只是想发挥出自己真实水平就行。

我在 1h 的时候通过了该题的全部大样例,因为习惯使用 memset,我在大赛时似乎从来没有出过多测不清空的问题,可是这题 T = 400,全部 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;
}