误闯天家,道心破碎——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 先写输出
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,如果这次能拿到奖就把出题人的浮木复活了。
分数:
力竭了,以后或许还会更新些细节……吧。
懒得更新了。
获奖:三等(分数线 86),蓟县。和第一次比赛(CSP-J2022 初赛)比分数线高 0.5 分进复赛首尾呼应了属于是。
C++ 没有背叛我喵!她(?)心里有我喵!要用一辈子 C++ 喵!