NOIP 2023 游记

· · 生活·游记

起

这次CSP-S小水,几乎是有分就过,然后在接下来的二十几天狠狠的学习,才勉强能打这比赛。

承

day 2

后天就要去比赛了,由于比较远,我们明天得提前去,住酒店 (可惜唯一女生不和我们一起去,自己去) ,然后这几天也不知道复习什么,疯狂切红题和模板题,而且也有点浮躁,其实也学不进去啥……

day 1

早上正常上课,中午两点多出发,辗转高铁地铁,终于在下午五点左右到了酒店,安顿下来,然后去吃饭,随便还去了大唐西市,感觉没啥吃的,然后再路边随便吃了一点,买了一点吃的当第二天早餐(酒店底下有微波炉,不得不说某团确实是便宜方便),回来后老师又强调了一些事情,安排妥当后就让我们早早睡了。

day 0!!!!!!

终于到了比赛的日子了,早上六点半左右就起了,热了一下买的早饭,草草一吃,就奔赴考场了(还有两位高三的同学一起,这是我们一起最后的OI生涯了,其实想一想还有点悲壮),在考点门口发了准考证,互相鼓励后就进去了。

我们在西工大附中考的,我那个考场貌似是物理实验室临时改的,一体机而且是 32 位系统(所以出了一点莫名其妙的问题但不影响)。

转

[ T1 ]

这道题,怎么说呢,难度不是很大,正解很容易想到 (这应该不算评论区题解吧),如果 m 等于 1,就按二十六个字母排序,别的话,把每个字母对应成数字(方便用 sort),先从小到大一下序(能够组成的最小字典序),再反着排一下(能够组成的最大字典序),那么如果如果一个单词的最小字典序比其他单词构成的最大字典序还大,那么不满足题意,反之,就是正解。

思路好想但是优化是个大问题。

但是我的代码在你谷上能跑能 AC,但毕竟是民间数据(我自己本地最后一个大样例 1.7 秒)。

考场代码

#include<bits/stdc++.h>
using namespace std;

int n,m;
struct nod {
    string a;
    int val;
    short zdx1[3001],zdx2[3001];

} zf[3003];
map<char,int> zd;

inline bool bj(int num) {
    for(int i=1; i<=n; i++) {
        if(i==num) continue;
        for(int j=1; j<=m; j++) {
            if(zf[num].zdx2[j]>zf[i].zdx1[j])
                return false;
            else if(zf[num].zdx2[j]<zf[i].zdx1[j])
                break;
        }
    }
    return true;
}
bool cmp (short a,short b) {
    return a>b;
}
int main () {
    cin.tie(0);
    char te='a';
    for(int i=1; i<=26; te++,i++)
        zd[te]=i;

    cin>>n>>m;
    for(int i=1; i<=n; i++)
        cin>>zf[i].a;
    if(m==1) {
        int mmin=40;
        for(int i=1; i<=n; i++) {
            zf[i].val=zd[zf[i].a[0]];
            mmin=min(mmin,zf[i].val);
        }
        for(int i=1; i<=n; i++) {
            if(zf[i].val==mmin)
                cout<<1;
            else
                cout<<0;
        }
    } else {
        for(int i=1; i<=n; i++) {
            for(int j=0; j<m; j++) {
                zf[i].zdx1[j+1]=zd[zf[i].a[j]];
                zf[i].zdx2[j+1]=zf[i].zdx1[j+1];
            }
            sort(zf[i].zdx1+1,zf[i].zdx1+1+m,cmp);
            sort(zf[i].zdx2+1,zf[i].zdx2+1+m);
        }
        for(int i=1; i<=n; i++) {//毕竟光这里貌似就 n^2*m 
            if(bj(i))
                cout<<1;
            else
                cout<<0;
        }
    }
    return 0;
}

[ T2 ]

怎么说呢,全 RE,也不知道哪出了问题,题意也几乎看不懂(只能说第一题真水,感觉可能都不是蓝题)。

我的考场思路:第三四点只有赋值,所以统计赋了几个 U 就行(理论得分:20)

剩下的点胡写的暴力(错的),没想到并查集。

[ T3 ] & [ T4 ]

两个字 不会!,考场上随便写了几个特例,貌似也不对。

合

下午一点,终于考完了,从考场出来时是一身轻松,然后大家一起去吃饭,回家,后来又想到那几位高三的同学,确实有些伤心,到最后,也忘了大家一起再拍一张合照(悲)。

最后祝各位OIer RP++!AKNOIP!教练、指导老师、出(验)题人身体健康!