CSP复赛游记——杭师大一日游

· · 生活·游记

绝密☆启用前

Day -inf

前一天也是一躺下来就睡着了,睁开眼就早上了。

省流,估分 89-92 分。

时间线来到考场,今年太仔细了,考场居然有封条。加分!有的说的是去年我在的考点似乎可能是因为考试时不让学生上厕所被举报了导致今年没能申请到考点(tang。

这次的开考铃声居然响了整整 10 s!然后开了 T1 发现 unsigned int(去年 int 今年 unsigned int 明年不会就是 unsigned long long 了吧)。 T4 忘记是咋写的了,痛失 2 pts。

前面 15 题我觉得中规中矩吧,反正比去年好多了,难度中偏上。写完时已是 10:10 了。

完善程序 1 比去年稍难,有点小坑,判断最后一个越界应该不算。完善程序 2 就是眼瞎了把限定 k 的正负性的题目的编号搞反了,痛失 4.5 pts(T24,T25)。评价一下,这次的完善程序 2 严格大于去年的。

但是看到完善程序 3 的时候感觉 CCF 又给我拉了坨大的,可以说是毫无新意,完全明显就是最长上升子序列模板,甚至简化成了数字版本。这就不太好评价了,但是还是比去年的同题难多了。此时时间是 10:55。

完善程序就很有区分度了。完善程序 1 几乎就是送分了,没有啥思维含量了,但是因为看错题目卡了整整 10 分钟!完善程序 2 就很有难度了,很难想象 J 组居然考函数式交互题。感性理解了 15 分钟左右才证明了贪心的正确性,摩尔投票还是太困难了!随口一提,完善程序 2 的算法解释是真的垃圾,导致 40 题选错了!此时时间已经到了 11:20。

最后 10 分钟极限查出 2 个错,挽回 2+3 pts。太刺激了,改完最后一个的时候监考老师都要开始收卷了。

最后预估得分 100-2-1.5-1.5-3-3=89 或 100-2-1.5-3-3=90.5 或 100-2-3-3=92 分。

upd:不同的地方估分有小差异。

这分数能不过我直接原地 AFO 了。

顺便锐评 CCF 双 T33 行为。出题人打印卷子之前都不会先再看一遍卷子吗?

You have no egg!

GESP 超常发挥了。 8 级 90 分免了。

上午 J 考完之后就回学校摆了一节培优班,然后口胡了一下 S,发现有部分人说 S<J 是咋回事。

算了就补一下 GESP 的游记吧。前面的题都很简单。写了大概 1h。编程题第一题很模板的双 ST 表维护一下就过了。第 2 题刚开是写搜索炸了,不会写换根 dp,想了一会发现可以记忆化,遂花了 5 分钟写记忆化,然后就是调了 20 分钟,输惨了。但是最后交上去的时候跑的飞快,愉快 AC。值得一提的是 CCF 没卡我菊花图,拜谢 CCF!

估分 89。

after inf days...

查分是发现居然 90。

Day 0

下午 3 点请假回家,吃了点东西,就狂飙到了动车站了。

在动车上把所有学的东西都复习了一遍,复习完时就差不多下车了。

坐地铁去到了杭师大门口蹲点考场后就回酒店了。(酒店夜宵好评)晚上发现自己一点都不紧张,但是晚上似睡非睡的,似乎梦到了好多东西...

Day 1

UPD:只能说 CSP-J 的总码量不如 CSP-S T1 了。

UPD:赛后发现利用类似离线思想,将排序预处理,即可满分。复杂度 O((m+nk) \log (m+nk)+2^knk)。这题属实应该评蓝,感觉是历史最难 T2 了。

赛后胡的正解:

  #include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,M=1e6+10;
struct node{
    int u;
    int v;
    long long w;
};
node b[M];
long long c[30];
long long a[30][N];
int f[N];
vector<node>v;
bool cmp(node A,node B){
    return A.w<B.w; 
}
int find(int id){
    return f[id]==id?id:f[id]=find(f[id]);
}
int n,m,k;
int t[30];
vector<node>e;
long long ans=1e18;
void check(){
    long long cnt=0;
    for(int i=1;i<=k;i++)if(t[i]){
        cnt+=c[i];
    }
    for(int i=1;i<=n+k;i++)f[i]=i;
    for(node to:e)if((to.u<=n || t[to.u-n]) && ((to.v<=n || t[to.v-n]))){
        int fa=find(to.u);
        int fb=find(to.v);
        if(fa!=fb){
            f[fa]=fb;
            //cout<<to.u<<" "<<to.v<<"\n";
            cnt+=to.w;
        }
    }
    //cout<<"\n";
    ans=min(ans,cnt);
    return;
}
void dfs(int len){
    if(len==k+1){
        check();
        return;
    }
    t[len]=0;
    dfs(len+1);
    t[len]=1;
    dfs(len+1);
}
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++){
        cin>>b[i].u>>b[i].v>>b[i].w;
    }
    sort(b+1,b+m+1,cmp); 
    for(int i=1;i<=k;i++){
        cin>>c[i];
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++)f[i]=i;
    for(int i=1;i<=m;i++){
        int fa=find(b[i].u);
        int fb=find(b[i].v);
        if(fa!=fb){
            f[fa]=fb;
            e.push_back({b[i].u,b[i].v,b[i].w});
        }
    }
    for(int i=1;i<=k;i++){
        for(int j=1;j<=n;j++){
            e.push_back({n+i,j,a[i][j]});
        }
    }
    sort(e.begin(),e.end(),cmp);
    dfs(1);
    cout<<ans<<"\n";
    return 0;
} 

时间只剩下了 30 分钟,开始打暴力了。T3 刚开始没看懂,就先写了 T4 8 pts 的部分分了。仔细阅读了 T3,才发现只能转换一次,因为时间不多了,就只写了 10 pts 的做法。写完之后就只剩下 5 分钟了,检查了一下 freopen 就结束了。

刚开始比完的时候还感觉这辈子没了,后来发现似乎都差不多就放心了。

比赛结束后自己的估分是 100+64+10+8=182。

和 wzb 大佬讨论了 T2,ta 没有注意到性质 2,r.i.p。

去地铁口时骑自行车掉链了(属于比赛阳寿用完了)

因为讨论的过于火热导致忘记带了身份证,然后就是身份证被发到了教练群了,被 zhr 大佬夸可爱了(嘻。

这个赛季似乎 \sqrt4 -> \sqrt7 了。

咕咕咕咕