2026 省选游记
Zskioaert1106 · · 生活·游记
目标:
Day -
听说自己能去参观人类高手选拔了,紧急学习一下去年省选 T1。
所以我这种切蓝率 0% 的入是怎么混进来的
拿到了准考证,上面终于没有人头了。
Day 1
一进场就闻到很浓的红牛味。
诶三道题都是我喜欢的题型。
可惜我太菜了,一道题都不会。
唉打暴力哪有吃吃喝喝香,打点特殊性质得了。
5h 狂砍 27 分和两盒三明治,还有一瓶橙汁。
Day 2
什么叫签到题放在第二天了。
二分贪心速通 T1 之后对着两个吓人题罚坐。
T2 是部分分吓人 T3 是题面吓人。
以为是
居然有两道非传统题,在没有任何用的 init 函数里默写了古文,在 T3 的 LCA 下面写了点小说。多亏样例更正给的 15min 加时,不然就写不完了。
Day +
考的不咋样,还好这次纯体验。估分
update:
附录
:::info[我的 industry.cpp]
#include<bits/stdc++.h>
using namespace std;
constexpr int N=100005;
int id,n,m,fa[N],dep[N],siz[N],wc[N],top[N];
vector<int>e[N];
void dfs1(int x){
dep[x]=dep[fa[x]]+1,siz[x]=1;
for(int u:e[x]){
if(u==fa[x])continue;
fa[u]=x;
dfs1(u);
siz[x]+=siz[u];
if(siz[u]>siz[wc[x]])wc[x]=u;
}
}
void dfs2(int x){
if(!wc[x])return;
top[wc[x]]=top[x];
dfs2(wc[x]);
for(int u:e[x]){
if(u==fa[x]||u==wc[x])continue;
top[u]=u;
dfs2(u);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
return (dep[x]<dep[y])?x:y;
}
int solve1(int rt,int s,int t,bool ox,bool oy,int r){
if(s==t)return 1;
if(!(ox||oy)){
if(s==rt||t==rt)return r>1;
return r>2;
}
if(!(ox&&oy)){
if(s==rt||t==rt)return (r>1)+1;
return (r>2)+(r>1)+1;
}
if(s==rt||t==rt)return (r>1)+1<<1;
return (r>1)*4+(r>2)*2+3;
}
int solve2(int s,int t,bool ox,bool oy){
if(!(ox||oy))return 0;
if(!(ox&&oy))return 1;
return dep[s]+dep[t]-2*dep[lca(s,t)]+1;
}
/*
你在一片闷热中醒来。眼前的漆黑混沌渐渐消退后,你看到面前是暗淡的电脑,嘈杂的键盘敲击声此起彼伏,窗外的阳光透过松柏的枝桠,在桌上投下几晕光斑。
“这是哪里?”脱口而出后,旁边的人看了你一眼。
慢着……我躺下之前不是在家里吗?我难道不是一边啃着面包,一边查看今年最新的省选 Day1 的题目吗?虽然说有点头晕,但是我睡的也不晚啊,怎么跟断片了一样?你努力理着思绪。
面前的电脑上有一个 PDF 文件,此外还有打开的 CodeBlocks,不过只有三个空白文件。
你向上滑了一下 PDF,“2026 联合省选 第二试”赫然在目。
我参加了省选?我参加省选了?
举手向监考老师示意了一下,你穿过走廊来到厕所,洗了把脸以平复自己的心情。从墙上瓷砖的痕迹到厕所中的气味,这里的一切都如此真实,让你一眼就能与记忆中的学校联系起来。
打开程序回收系统,确实是你的名字没错。只是这场考试还有十分钟就要结束了。
你有些伤感,不论这份记忆是真是假,难道第一次参加省选就要无疾而终吗?
你不甘地瞪大双眸,想在最后的时间内记住题目。
你看到第一题“排列游戏”。
为什么是一道交互题?你在纷繁庞杂的【题目描述】【实现细节】【评分方式】里徘徊。时间一分一秒地流过,你终于大概明白了这道题的意思。就是说每次可以询问区间 mex,询问不能超过 O(n log n) 次,要给出一个排列,使得对于所有 n(n+1)/2 个询问,答案和原排列都一样。
你差不多想出来怎么做了。可以先二分出 0 和 1 的位置,如果 2 在这两个位置之间则无法确定具体的位置,然后这样就可以得到 n 个数的合法位置区间,然后就可以用一个优先队列贪心求合法方案了。
这本来是一个非常好写的解法,可这偏偏是交互题。你按照题目里的【测试程序方式】将好不容易搞明白的两个函数编译,在终端输入了:
g++ grader.cpp perm.cpp -o perm -std=gnu++14 -O2 -static
失败……你将调试用的 main 函数删去,再次输入:
g++ grader.cpp perm.cpp -o perm -std=gnu++14 -O2 -static
失败……你将程序的文件名从 T1.cpp 改为 perm.cpp,再次输入:
g++ grader.cpp perm.cpp -o perm -std=gnu++14 -O2 -static
为什么这个好不容易生成的 exe 打不开啊!!!你要崩溃了。还剩 5 分钟的提示也好巧不巧地响起……真是屋漏偏逢连夜雨,你马上就要绝望了,却有一个人推门而入:
“由于样例解释的更正,CCF 决定加时 15 分钟。”
你这才注意到讲台旁的黑板,上面一左一右,分别写着两个 T3 的样例更正。
“想不到竟然是我素未谋面的 T3 挽救了我。”你暗自窃喜,“我果然是世界的主角!”
你重燃斗志,赶忙在 grader.cpp 内修改,通过了大样例。
向下一滑,“星图”映入眼帘。
“星图铺就的,未必是归途。”
“但有人循着它,便不算迷路。”
一问一答之间,无数遗忘的记忆溯着漫天星轨,拥回了你的脑海。
*/
int main(){
freopen("industry.in","r",stdin);
freopen("industry.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>id>>n;
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
e[u].push_back(v),e[v].push_back(u);
}
cin>>m;
if(id==1){
int rt=0;
while(++rt)
if(e[rt].size()==n-1)break;
while(m--){
bool ox,oy;
int s,t,r;
cin>>s>>t>>ox>>oy>>r;
cout<<solve1(rt,s,t,ox,oy,r)<<'\n';
}
return 0;
}
dfs1(1);
top[1]=1;
dfs2(1);
while(m--){
bool ox,oy;
int s,t,r;
cin>>s>>t>>ox>>oy>>r;
if(s==t){
cout<<"1\n";
continue;
}
cout<<solve2(s,t,ox,oy)<<'\n';
}
return 0;
}
:::
以及完整小说的链接(文笔不好,逻辑不强,布局不精,当乐子看吧)。