⚡⚡⚡史上最区吃薯片之我在地铁站坐地铁时合成能量水晶,结果奶气冲天引发群鸟迁徙,被最强奶龙 shuqiang 贬至 D 国研发基地⚡⚡⚡

· · 生活·游记

注:本文含有大量 MARETU 图片,我会放到折叠框里面。

::::info[省流] 对于能否拿到 1= be like:

::::

Day -inf

在初赛前发现今年 NOIP 时间刚好是我生日,猜猜我的生日是在机房里过还是在家里过(

你说得对,但是考 NOIP 的时候是 @chenzhixuan2010 的生日,只要转发这条信息就能吊打 @chenzhixuan2010,我试过了,是假的,因为 NOIP 还有一个月,但 NOIP 那天真的是 @chenzhixuan2010 的生日。

初赛游记不写了,毕竟都是猜过的。

Day -1

学校初中校运会,高中生要上课还不给看难受了。

考前认为今年极有可能出大模拟。最强奶龙 shuqiang 说重现赛有个大模拟题,遂报名重现赛打大模拟,过了样例然后挂了。我咋这么区。

然后发现全机房都报名了这个信心赛,到底是咋找到的我咋不知道。🤔遂报名看看这个信心赛是啥。怎么还有 8 题,神圣。

诶不是这个 T4 我 TLE 几个意思。然后改了 inf 分钟发现快读会 TLE,cin 会 WA,改成 scanf 过了。好神圣。此时同机房巨佬臭氧层已经切 H 了。%%%。

放学前老师交代要检查 cmd 能不能用,我因此被批了一顿说是 GZOI 的时候考前没检查考时才出问题。不是我上一年在那里考 CSP 的时候 cmd 也没禁啊,自己忘记解禁 cmd 怎么还怪上我了。愤怒。

回家之后果断选择复习 whk,因为要期中考了。

Day 0

J 组没报,所以爆了。

J 组解包密码怎么是 Trick||Treat!,这么雷霆,那我猜一手 S 组解包密码是 H@ppy&&H@||oween!。

最强奶龙 shuqiang 考完说四道都是红,他 AK 了。%%%。然后他发现自己 T1 看错题把 F 看成 E 了直接爆炸。这下真变奶龙了,奶气冲天。

什么叫 J 组 T3 还有原?

::::info[做干净的奥赛?] ::::

下午打 S 组,认为自己没有 200 分的实力,毕竟我是大区一条,到现在都还没勾。摇一下 rngdle,怎么是 common,那完蛋。

去的路上严肃听了ホワイトハッピ、ゴキブリの味、ダーリン、いのちのおどり、ニャン。你别问为什么都是 MARETU 的,因为豪庭。😋为什么我们全校都没几个听土的,难受。

进考场前突然听到神秘吵闹声,转头一看原来是最强晓康的准考证被风拐走了。准考证纷纷何所似?撒 NaCl 空中差可拟未若柳絮因风起。奶气冲天了。

依旧提前发密码,不是这个密码怎么是 Oct31==Dec25?,CCF 提前过圣诞节吗。我宣布今天是圣诞节。还是因为上一年 You have no egg! 所以只剩一个蛋了。

开始看题。我去四题都给 \text{1024MiB} 的空间这么好。一想到老师给我们做的那个雷霆模拟赛卡空间就想笑。发现 T1 像奶龙题,然后看 T2。不是这个 T2 这么长?看 T3,看着很简单但估计有紫。看 T4,这啥,看不懂。

14:30 准时开打。本来是差分的,打完缺省源发现自己假了。我好弱。但我发现先排序,然后双指针就做完了。大喜,遂开写,并在 14:53 通过大样例。看一下 checker,不是怎么无法识别题目文件夹。哦原来是要我自己填题目名称啊。这都不帮我填,怎么这么懒。看了一手边界情况,都过了,那我直接对拍。

此时开 T2,题目这么长不会是大模拟吧。10min 看完发现是图论,不豪。发现地铁线路才 500 条,考虑分层图,发现可做。

诶不对啊那我点数不就 500\times500000=2.5\times10^8 了,这不炸谁炸。哦哦每个点最多只有 20 条线经过啊,那 20\times500000=10^7 确实炸不了。那我直接建完分层图跑 Dijkstra 不就好了。

不怼,这个最小的样例怎么跑了 0.1 秒。不是这个样例 3 和 4 咋都跑了 1.7 秒,那我不是 60 分都没了。爆炸。

开 T3 罢,猜了 30min 结论,写完发现第 3 个样例就错了。难受,这把不会连 160 都没吧,那我 AFO 了。

回看 T2,发现每条线路联通的所有点可以 0 花费直接到达,本质上可以看成一个点,而 n 才 500,所以最多只有 500 个点。这个数据范围看着就很能 Floyd 啊,不会真是 Floyd 吧?那我提前预处理每两条地铁线间的最短路,设编号为 i,j 的地铁线路间最短路为 dp_{i,j},然后最后求答案的时候答案就是 \min\limits_{i=1}^n \min\limits_{j=1}^n w_u+w_v+t_{u,i}+t_{v,j}+dp_{i,j} 吧。不对啊这个 n 有 500 那我询问是 O(qn^2) 不就炸了。哦我又把 d 忘了,那么可以做到询问 O(qd^2)。

那我最短路会经过 u 和 v 不炸了。深度思考 20min 发现出现这种情况一定会有更优的,所以是对的。那么时间复杂度 O(n^3+(m+q)\times d^2),看着就很对啊,跑了一下大样例发现全过了。跑得好慢,发现把暴力代码定义的那几个雷霆数组删了就跑得飞快,这么神圣。大喜,遂对拍。

::::info[T2 思考路径 be like] ::::

我造怎么刚拍第一组就错了,之前推的好像也没问题吧。难道我暴力错了?那我用暴力跑一下最大那个样例。

ok 趁我的 T2 暴力还在跑,看看 T3。然后就坐牢了,因为写了 1e9+7 种我认为可能正确的写法发现都是错的。难受。

坐牢 30min 后 T2 暴力跑完了。不是怎么过大样例了,那我到底对没对啊,这个大样例这么水吗。爆炸。

::::info[发现暴力跑过大样例的我 be like] :::: ::::info[钦定自己是暴力写炸正解没炸时 be like]

其实并非谎言,因为还真没炸(

最后 T4 写了暴力但是也炸了,T3 直接总司令全部输出 0。轻松 100+[0,100]+0+0=[100,200],准备 AFO。

考完出来了,发现一圈人会 T2。完了怎么被大众题击败了,我是大区。

等了 30min 开自测。不是这个黄绿紫紫何意味啊,这个 T2 有这么简单?这个 Floyd 真的是人类思路?先测 T2,发现过了,大喜。然后测 T1。不豪怎么 45 分。这能错?这能错?这能错?然后发现原来是我忘记排序了,排序一下就过了,奶气冲天。

居然有 200 分,已经严肃击败去年的我了。此时发现 T2 升青 T4 升黑。你看我就说题目里带个 \frac{1}{2} shuqiang 的题怎么能是紫的,毕竟最强奶龙 shuqiang 是最强的能 AK IOI。今年黄青紫黑有点意思,好像是我打过的 S 组里面难度最高的。但我还是大区被所有人击败了。感觉远低于大众分。坠机,没 1= 了。

::::info[今年吃薯片 be like] ::::

事实上我在最后 5 分钟里整了点活,比如把函数名改成 shuqiangakioi 和在注释里写 50 个 abs('D' - 'F') != 1 !!!!!!!!!!!(

贴一下复现的 T1 T2 code 罢。

::::info[T1]

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Fast{
    inline int fr(){
        int x = 0,f = 1;
        char c = getchar();
        while (c < '0' || c > '9'){
            if (c == '-') f = 0;
            c = getchar();
        }
        while (c >= '0' && c <= '9'){
            x = (x << 1) + (x << 3) + (c ^ 48);
            c = getchar();
        }
        return (f ? x : -x);
    }
    inline void fw(int x){
        if (x == 0) return putchar('0'),void();
        if (x < 0) x = -x,putchar('-');
        stack <char> stk;
        while (x){
            stk.push(x % 10 + '0');
            x /= 10;
        }
        while (!stk.empty()){
            putchar(stk.top());
            stk.pop();
        }
    }
}

using namespace Fast;
int n,k;
int a[500005];
signed main(){
    n = fr(),k = fr();
    for (int i = 1;i <= n;i++) a[i] = fr();
    sort(a + 1,a + n + 1);
    int l = 1,sum = 0,ans = 1;
    for (int i = 2;i <= n;i++){
        sum += (i - l) * (a[i] - a[i - 1]);
        while (l < i && sum > k){
            sum -= (a[i] - a[l]);
            l++;
        }
        ans = max(ans,i - l + 1);
    }
    fw(ans);
    return 0;
}

:::: ::::info[T2]

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Fast{
    inline int fr(){
        int x = 0,f = 1;
        char c = getchar();
        while (c < '0' || c > '9'){
            if (c == '-') f = 0;
            c = getchar();
        }
        while (c >= '0' && c <= '9'){
            x = (x << 1) + (x << 3) + (c ^ 48);
            c = getchar();
        }
        return (f ? x : -x);
    }
    inline void fw(int x){
        if (x == 0) return putchar('0'),void();
        if (x < 0) x = -x,putchar('-');
        stack <char> stk;
        while (x){
            stk.push(x % 10 + '0');
            x /= 10;
        }
        while (!stk.empty()){
            putchar(stk.top());
            stk.pop();
        }
    }
}

using namespace Fast;
const int MAXM = 5e5 + 5;
const int MAXN = 505;
const int INF = 0x3f3f3f3f3f3f3f3f;
int c,n,m,d,q;
int w[MAXM],cnt[MAXM],idx[MAXM][25],tdis[MAXM][25];
int dp[MAXN][MAXN];
signed main(){
    c = fr(),n = fr(),m = fr(),d = fr(),q = fr();
    for (int i = 1;i <= m;i++) w[i] = fr(),cnt[i] = 0;
    for (int i = 1;i <= n;i++){
        int len = fr();
        for (int j = 1;j <= len;j++){
            int a = fr(),t = fr();
            cnt[a]++;
            idx[a][cnt[a]] = i;
            tdis[a][cnt[a]] = t;
        }
    }
    memset(dp,0x3f,sizeof(dp));
    for (int i = 0;i <= n;i++) dp[i][i] = 0;
    for (int i = 1;i <= m;i++){
        for (int j = 1;j <= cnt[i];j++){
            for (int k = j + 1;k <= cnt[i];k++){
                int x = idx[i][j],y = idx[i][k];
                dp[x][y] = min(dp[x][y],tdis[i][j] + tdis[i][k]);
                dp[y][x] = min(dp[y][x],tdis[i][j] + tdis[i][k]);
            }
        }
    }
    for (int k = 1;k <= n;k++){
        for (int i = 1;i <= n;i++){
            for (int j = 1;j <= n;j++){
                dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j]);
            }
        }
    }
    for (int i = 1;i <= q;i++){
        int u = fr(),v = fr();
        int ans = INF;
        for (int j = 1;j <= cnt[u];j++){
            for (int k = 1;k <= cnt[v];k++){
                int x = idx[u][j],y = idx[v][k];
                int res = w[u] + w[v] + tdis[u][j] + tdis[v][k];
                ans = min(ans,res + dp[x][y]);
            }
        }
        fw(ans),putchar('\n');
    }
    return 0;
}

::::