误闯天家,道心破碎——NOIP2025游记

· · 生活·游记

Update on 2025.12.3:更新了代码、分数和一些闲话。

Update on 2025.12.15:更新了奖项和一些闲话,顺便把 CCF 的马复活了

这条视频就像是给我准备的:

本来并不准备写这次的游记,但毕竟是我退役前的最后一战,还是留作纪念吧。

赛前

前情提要

提前一个小时去了机房,基本上啥都没干,14:55 出发。路上先刷 B 站。给 zjy 开了热点,莫名其妙 5MB/s,他把 Steam 关了才好。Steam 赔我流量。然后刷小黑盒,睡了一会。快到的时候实在没事干,打了把王者(玩 MC 后就没打开过。顺便给自己的 MC 服务器打个广告,想要加的私我)。bjx 在玩刚毅版 MC。

到酒店后大概已经 18:20 了,先去房间把东西放了。连上 Wi-Fi 后顺便把我将近 50 个 APP 更新了。这次订的酒店和上次差不多,稍微小了一点。接着就是保留节目——出去觅食(话说为什么从来都不一起定下来吃啥啊)。看了眼地图决定吃金拱门。原本是准备去万达的,但发现坐地铁还要 20 多分钟(其实有一家更近的)。快走到的时候被一个人(保安?)拦下来了,貌似是那家麦当劳开在阿里的园区里。就换了一家,也不是很远。但是——路上偶遇 KFC,拼尽全力无法战胜,最后吃了 KFC。鸡肉卷 + 薯条 + 三柠茶 + 巧克力甜筒(这个居然被 bjx 质疑了,冬天吃冰淇淋不是很正常的事情吗)。后面有一桌别的学校的,没认出来。

回酒店后打了把王者(强度还挺高的,对面有个省标。但我元歌第一次在真人局打出 28% 的输出,最后逆风翻盘)。开始复习。数学,线段树,字符串这些基本都看了一遍。然后刷了会儿 B 站,上了个厕所,睡了。实际上还聊了半小时。

第二天依旧提前闹钟 5 分钟醒,但这次没把闹钟关掉(雾。只吃了炒饭,怕和上次一样拉肚子。走到考场,又给 bjx 拍了几张照。

赛时

懒得写那么多了。T1 想了 15 分钟,写了半小时,调了 15 分钟,还是 WA 了一个大样例(甚至和大部分人错的都不一样,感觉有点似了)。现在想到考场的做法其实挺蠢的,不仅有点小错误而且还有很多完全浪费的操作,居然没想到只有一个会取偶数个。时间应该够,但过程中可能产生很多错误。

T2 先写输出 2^n,然后特殊性质写了 4 个没有一个对的。暴力也没调出来。12:00 的时候已经彻底道心破碎了。

T3 和 T4 不予评价。CCF 打算直接选国家队了说是。

结束前发现 T1 最小值初值赋错了,幸好改过来了。

::::info[T1 代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node
{
    ll id,val,st;
    bool operator>(Node x)const
    {
        return val>x.val;
    }
};
priority_queue<Node,vector<Node>,greater<Node> > q;
ll x[2][100005];
ll minn=2000000005,minid,miny=2000000005;
int main()
{
    ios::sync_with_stdio(false);
    freopen("candy.in","r",stdin);//Don't foget to change this.
    freopen("candy.out","w",stdout);
    ll n,m,i;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>x[0][i]>>x[1][i];
        q.push({i,x[0][i],0});
        if(x[0][i]+x[1][i]<minn||(x[0][i]+x[1][i]==minn&&x[1][i]>miny))
            minn=x[0][i]+x[1][i],minid=i,miny=x[1][i];
    }
    ll ans=(m/minn)<<1,sp=m%minn;
    int flag=1;
    while(sp>=q.top().val)
    {
        sp-=q.top().val;
        if(minid==q.top().id)
            flag=(flag+1)%2;
        int t=q.top().id,stt=q.top().st;
        q.pop();
        ans++;
        q.push({t,x[(stt+1)%2][t],(stt+1)%2});
    }
    while(x[flag][minid]>q.top().val)
    {
        if(q.top().id==minid&&flag==q.top().st)
        {
            q.pop();
            continue;
        }
        sp+=(x[flag][minid]-q.top().val);
        flag=(flag+1)%2;
        int t=q.top().id,stt=q.top().st;
        q.pop();
        q.push({t,x[(stt+1)%2][t],(stt+1)%2});
        q.push({minid,x[(flag+1)%2][minid],(flag+1)%2});
        while(sp>=q.top().val)
        {
            sp-=q.top().val;
            if(minid==q.top().id)
                flag=(flag+1)%2;
            int t=q.top().id,stt=q.top().st;
            q.pop();
            ans++;
            q.push({t,x[(stt+1)%2][t],(stt+1)%2});
        }
    }
    cout<<ans<<'\n';
    return 0;
}
//9:27 only WA on #6,the answer is smaller.

:::: ::::info[T2 代码]

#include<bits/stdc++.h>
using namespace std;
#define M 998244353
typedef long long ll;
ll qpow(ll a,ll b)
{
    ll ans=1,p=a;
    while(b)
    {
        if(b&1)
            ans=ans*p%M;
        p=p*p%M;
        b>>=1;
    }
    return ans%M;
}
int a[5005],w[5005],n,m;
int f[305][605];
int v[5005];
int dp()
{
    int i,j;
    for(i=0;i<=n;i++)
        for(j=0;j<=m;j++)
            f[i][j]=0;
    for(i=1;i<=n;i++)
        for(j=m;j>=w[i];j--)
            f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+a[i]);
    return f[n][m];
}
struct Node
{
    int aa,w,v,id;
}k[5005];
bool cmp(Node a,Node b)
{
    if(a.v==b.v)
    {
        if(a.aa==b.aa)
            return a.id<b.id;
        return a.aa>b.aa;
    }
    return a.v>b.v;
}
int tan()
{
    int ans=0,i;
    for(i=1;i<=n;i++)
    {
        k[i].aa=a[i];
        k[i].w=w[i];
        k[i].v=(2/w[i])*a[i];
        k[i].id=i;
    }
    sort(k+1,k+n+1,cmp);
    int sp=m;
    while(sp>0)
    {
        if(sp>=k[i].w)
        {
            sp-=k[i].w;
            ans+=k[i].aa;
        }
    }
    return ans;
}
bool cmp2(int x,int y)
{
    return x<y;
}
int main()
{
    ios::sync_with_stdio(false);
    freopen("sale.in","r",stdin);
    freopen("sale.out","w",stdout);
    ll c,t;
    cin>>c>>t;
    if(c==18||c==16)
    {
        while(t--)
        {
            int i;
            cin>>n>>m;
            for(i=1;i<=n;i++)
                cin>>m;
            cout<<qpow(2,n)<<'\n';
        }
        return 0;
    }
    else if(c==7||c==8||c==9||c==14||c==15)
    {
        while(t--)
        {
            int i;
            cin>>n>>m;
            for(i=1;i<=n;i++)
            {
                cin>>a[i];
            }
            sort(a+1,a+n+1,cmp2);
            int xx=upper_bound(a+1,a+n+1,a[n]>>1)-a;
            cout<<((qpow(2,n)-qpow(2,xx-1)*(n-xx)+M)%M+M)%M<<'\n';
        }
    }
    /*else if(c==17)
    {
        while(t--)
        {
            int minn1=1000000005,minn2=1000000005;
            int tt,i;
            cin>>n>>m;
            for(i=1;i<=n;i++)
            {
                cin>>tt;
                if(tt<=minn1)
                    minn2=minn1,minn1=tt;
                else if(t<=minn2)
                    minn2=tt;
            }
            if((minn1<<1)>minn2)
                cout<<qpow(2,n)-1<<'\n';
            else
                cout<<qpow(2,n)<<'\n';
        }
        return 0;
    }*/
    else
    {
        while(t--)
        {
            int i,j,ans=0;
            cin>>n>>m;
            for(i=1;i<=n;i++)
            {
                cin>>a[i];
            }
            int x=qpow(2,n);
            for(i=0;i<x;i++)
            {
                int kk=i;
                for(j=0;j<n;j++)
                {
                    w[j+1]=kk%2;
                    kk>>=1;
                }
                if(dp()==tan())
                {
                    ans++;
                }
            }
            cout<<ans<<'\n';
        }
    }
    return 0;
}//11:28 every solution is wrong.

:::: ::::info[T3 代码]

//freopen("tree.in","r",stdin);
//freopen("tree.out","w",stdout);
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ios::sync_with_stdio(false);
    freopen("tree.in","r",stdin);
    freopen("tree.out","w",stdout);
    srand(time(NULL));
    cout<<rand()<<'\n';
    return 0;
}

:::: ::::info[T4 代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ios::sync_with_stdio(false);
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);
    srand(time(NULL));
    cout<<rand()<<'\n';
    return 0;
}

::::

赛后

一开始应该是黄紫黑黑,后来改成黄黑黑黑了(本文撰写时改回了黄紫黑黑)。NOIP = NOI Pro。试题解压密码 !noip@Nov29,2025:dream 的意思其实是:“不是 NOIP,2025 年 11 月 29 日是场梦”。又吃了 KFC,辣堡 + 辣翅 + 三柠茶 + 甜筒(又被同学质疑了)。从出考场到回学校骂了一路 CCF,如果这次能拿到奖就把出题人的浮木复活了

分数:80+8+0+0=88

力竭了,以后或许还会更新些细节……吧。

懒得更新了。

获奖:三等(分数线 86),蓟县。和第一次比赛(CSP-J2022 初赛)比分数线高 0.5 分进复赛首尾呼应了属于是。

C++ 没有背叛我喵!她(?)心里有我喵!要用一辈子 C++ 喵!