2025年 全国青少年信息学奥林匹克竞赛 重庆代表队选拔 游记

· · 生活·游记

反正没停课,就从今天开始写。

先写点占位,以防投稿截止。

规定省选第一天三月一日为 Day 1,其前一天二月二十八日为 Day 0,以此类推。

Day -12

正式开学的前一天晚上,是时候返校了。

省选准考证号 CQ-066,好像是按联赛成绩排的,但是不欢迎面基。

因为不准备省选,也不想停课就为了天天浪费一上午去做一道题都不会做的模拟测试。看穿了竞赛的虚无与意义的我,毅然决然地拒绝了停课,当然付出了惨痛的代价——被流放出小机房。

对于这件事情我的看法和感想会在后续文章有所披露,所以这里就略去此部分内容,敬请期待。

Day -11

开学典礼,我校已经被某高等学府录取一位初三数学竞赛学子做了开学典礼发言。校长最后号召大家(虽然是口误)“少一些专注,多一些躺平”的这个方针我们要贯彻到底。

然后丰富的高中生活就这样开始了。

周一下午的体育课和初三的学弟学妹们刚好是一个时间,你知道我要干什么(滑稽。

Day -6

经过一周高强度文化课摧残我对竞赛失去了任何兴趣遂开始写作业。

给学弟 @do_it_tomorrow 改格式要把我累死了,真是费力至极。

Day -1

吃饭的时候听说机房里有人在有组织的在洛谷里“搞事情”结果被封号了。

但是我的【数据删除】你怎么没了啊呜呜呜没有你谁陪我水犇犇啊。

Day 0

中午走的时候看到了一路上都是省选的指路牌。

一天都在上文化课,所以我们学校省选合照的时候我没去,有点遗憾但不多。

晚上随便复习了一点模板,知道了考场是在 1 机房,参加了 QOJ 的第二十届模板测试赛,然后就滚回去写作业了。

睡前在 QQ 上找可爱圣母 @cyh20100812 寻求精神支持,很可惜我并没有等到就睡觉了。

Day 1

联合省选 Day 1。

我该在哪里停留?我问我自己。

——省选联考 2025 Day1T2

今天上午还有四节理科的课呜呜呜没上到,问题不大都还比较简单随便自学一下就可以了。

嗯,上来就看第一题,感觉好像不是很难。

A 性质就是限制值域,不用他提示我也知道肯定要离散化的。

B 性质就是固定个数,这种情况就不需要讨论了。

但是乍一看好像对整个题目都没有什么启发。

猜测一个结论,能计算出的中位数必定是连续的,除非值域是断开的。

如何判断某一个数可不可以作为中位数呢?

为了两极的个数差对中位数的影响尽量小,能取到这个数的区间肯定数量要最大化。

至于两边的,就要让个数差尽量小避免影响中位数,那么就求出两边的个数的极值区间,稍微比较一下就可以了。

然后写了两个小时,大样例通过了。

然后写了第二题和第三题的最低档部分分以后,想了各种奇奇怪怪的特殊性质,开始罚坐。

出去上厕所i的时候看见了我们班的同学在操场上面玩耍,唉,这就是班会课。

静态检查了一下第一题的代码,发现了一个致命错误,于是我赶紧修改了过来。大样例这个数据强度也是绝了。

下午西湖大学校长施一公莅临我校,然后开展了“拔尖人才创新培养的西湖实践”的讲座。

结果看了一个小时的宣传片,半小时是我们学校的,半小时是西湖大学的。

我从来没有看到过学校那么多的宣传片,然后在其中惊奇的发现了去年四月为了校庆拍的线段树,但是镜头只给了一秒钟。

生物竞赛的同学告诉我他们之前出去外培的时候已经参观过西湖大学了,确实是一所很新的学校。

然后施一公院士介绍了西湖大学的“高起点,小而精,研究型”,那确实很令人向往了,但以我的水平真的可以考得上吗。

回到家才知道施一公院士只是过来跑重庆马拉松的,然后顺路过来宣讲,上午已经去过很多个学校了。

晚上回去开始赶作业,很好很好啊。

Day 2

联合省选 Day 2。

“希望大家都能忘记我。”

——省选联考 2025 Day2T2

还是一样的上来先看第一题。

这个特殊性质也是没啥大用系列,只是部分分可以一眼秒了,对于普适性的做法再看看呢。

这个题让我想起了前年提高级的种树,不就是按时间排序依次完成就好了,正确性易证。

至于这个推箱子操作,就很像我赛前看的 [ABC371F] Takahashi in Narrow Road。

说起来也很神奇,这本来是我打 ABC371 没有做出来且唯一没有订正的题,然后省选前几天就想做做这个题,但是因为比较摆烂想了一个算法没实现。

于是我就在考场上开始实现我未经证明时间复杂度的势能线段树算法,想着不能过在换个思路就行了,没想到样例跑得飞快就没管他。

代码已经放在下面了欢迎大家帮我严谨证明这个时间复杂度,代码里附了一些注释方便理解。

然后又写了第二题和第三题的最低部分分,因为特殊性质真的一点都不会啊,然后就罚坐结束了。

在出来的时候面基了 @HedyLamarr520,错过了这么多次终于面到了。

然后回去写作文写到了很晚,一下午和一晚上是能让我写完周末作业的吗。

Day 3

所有信息学竞赛选手回归文化课班级。

他们晚上补化学课的时候,因为我已经上过了,所以我去隔壁班看 《Good Luck Charlie》。

Day 6

初评成绩和申诉的时候到了。

非常好没有挂分啊,248 = 128(=100+20+8) + 120(=100+12+8),算下来标准分有整整 53.97=260/400*40+248/532*60,好吧连省队的屁股都摸不到。

前几天还在和 @xiahaob 吃饭的时候聊到全国省选最高分不可能超过 500,没想到很快就被巴蜀的高一选手打脸了。

附件

代码长度按题目顺序单调递减,这个是真的很好笑。

以下是注释节选。

Day 1

lucky.cpp

/*
文化则不辩水平而止之,省选于我何加焉。
倒一也是一,但是我没停课,至少不会对不起自己。 
今年输入量多少有点超标了,随便看个大样例都是 10 MB。 
平常心对待就好啦,反正我也无所畏惧了。
昨天晚上告诉物理老师明天上不了课,然后物理老师还来给我加油,狂喜。 
我会永远热爱我的文化课的。 
深度思考(用时 114s)。
我以为 PDF 有密码来着,一直没打开,结果发现没有密码。 
2025 联合省选
第一试
时间:2025 年 3 月 1 日 08:30 ~ 13:00
*/

recall.cpp

/*
回不去的过去,望不穿的未来。
也许,我再努力十年,也追不上那个她吧。
那我现在所做的一切,还有什么意义呢。 
*/

graperm.cpp

/*
过去未来只是想象中一场美丽电影
小心在梦境太过沉溺 
*/

Day 2

move.cpp

//the code is from chenjh
#include<bits/stdc++.h>
#define MAXN 200002
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
typedef long long LL;
using ci=const int;
int cs;
int n;
struct BOX{
    int a,b;
    LL t;
}e[MAXN];
int p[MAXN];
struct Node{
    int l,r;//该节点最左端点的坐标和最右端点的坐标。
    Node(ci _l=0,ci _r=0):l(_l),r(_r){}
    Node operator + (const Node&B)const{return Node(l,B.r);}
}t[MAXN<<2];
void bld(ci rt,ci l,ci r){//线段树建树。
    if(l==r){t[rt]=Node(e[l].a,e[l].a);return;}//初始值设为当前点。
    int mid=(l+r)>>1;
    bld(lson,l,mid),bld(rson,mid+1,r);
    t[rt]=t[lson]+t[rson];
}
void pd(ci rt,ci l,ci r){//下放推平标记。
    if(t[rt].r-t[rt].l==r-l){//如果说一整块在一起,就向下传递。
        int mid=(l+r)>>1;
        t[lson].l=t[rt].l,t[lson].r=t[rt].l+mid-l;
        t[rson].l=t[rt].r-(r-(mid+1)),t[rson].r=t[rt].r;
    }
}
LL lmv(ci rt,ci l,ci r,ci L,ci R,ci x){//向左移动,使 [L,R] 区间内的点的所有坐标小于等于 x。
    if(t[rt].r<=x) return 0;//如果坐标已经满足要求,就结束递归。
    if(L<=l&&r<=R&&t[rt].r-t[rt].l==r-l){//在该区间内,且坐标连续,直接对整段进行处理。
        LL ret=(t[rt].r-x)*(r-l+1ll);
        t[rt].r=x,t[rt].l=x-r+l;
        return ret;
    }
    pd(rt,l,r);
    int mid=(l+r)>>1;
    LL ret=0;
    if(L<=mid&&mid<R) ret=lmv(lson,l,mid,L,mid,x-(R-mid))+lmv(rson,mid+1,r,mid+1,R,x);
    else if(L<=mid) ret=lmv(lson,l,mid,L,R,x);
    else if(mid<R) ret=lmv(rson,mid+1,r,L,R,x);
    t[rt]=t[lson]+t[rson];
    return ret;//返回这次操作所需要的时间。
}
LL rmv(ci rt,ci l,ci r,ci L,ci R,ci x){向右移动,使 [L,R] 区间内的点的所有坐标大于等于 x,和上一个函数大致相同。
    if(t[rt].l>=x) return 0;
    if(L<=l&&r<=R&&t[rt].r-t[rt].l==r-l){
        LL ret=(x-t[rt].l)*(r-l+1ll);
        t[rt].l=x,t[rt].r=x+r-l;
        return ret;
    }
    pd(rt,l,r);
    int mid=(l+r)>>1;
    LL ret=0;
    if(L<=mid&&mid<R) ret=rmv(lson,l,mid,L,mid,x)+rmv(rson,mid+1,r,mid+1,R,x+(mid-L+1));
    else if(L<=mid) ret=rmv(lson,l,mid,L,R,x);
    else if(mid<R) ret=rmv(rson,mid+1,r,L,R,x);
    t[rt]=t[lson]+t[rson];
    return ret;
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>e[i].a>>e[i].b>>e[i].t,p[i]=i;
    bld(1,1,n);
    sort(p+1,p+n+1,[](const int x,const int y){return e[x].t==e[y].t?e[x].a<e[y].a:e[x].t<e[y].t;});//按时间要求排序。
    LL w=0;
    for(int i=1,u;i<=n;i++){
        u=p[i];
        if(e[u].a!=e[u].b){
            w+=e[u].a<e[u].b?rmv(1,1,n,u,n,e[u].b):lmv(1,1,n,1,u,e[u].b);//获取操作需要完成的时间,并相加求到当前时间。
            if(w>e[u].t){//时间超过要求,退出。
                cout<<"No\n";
                return;
            }
        }
    }
    cout<<"Yes\n";
}
int main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int T;cin>>cs>>T;
    while(T--) solve();
    return 0;
}

/*
不行今天是 tad_ao 监考,宣读考场规则的时候觉得莫名有点好笑。 
*/

years.cpp

/*
希望大家一直记得我。
“希望大家永远忘了我。” 
*/

后记

不会有后续。