THUPC 2024 初赛 被带飞记

· · 生活·游记

APJifengc 不想写游记了,那我来写!

Day ?

听说有 THUPC,机房只有 ReTF 想打,我随便,别人不想打。这时 APJifengc 问我打不打,我立马就同意了,然后我、APJifengc、fzj2007 组了一队。

我们队三个人有三块 Ag,我们三个真是太强啦!

(APJifengc 有两块,fzj2007 有一块,我有零块)

APJifengc:“来个队伍名”

我:“无论我回答什么都会被当成队伍名吧”

于是队名就是“无论我回答什么都会被当成队伍名吧”

Day 0

讨论了策略,结论是没有什么策略。

Day 1

考前分了一下开始时看题分配,APJifengc 负责 ABCDM,fzj2007 负责 EFGH,我负责 IJKL。使用 QQ 语音通话交流。

开题了,APJifengc 直冲 M 原神题,过了,我发现 K 打表即可,开始写。

APJifengc 过 C,我过 K,我吃了一发罚时,没玩过 tetr.io 导致的。我俩闲下来了,fzj2007 E 没调出来,APJifengc 接手,我去看 J,fzj2007 去 H。

APJifengc 调出 E,我觉得 J 不适合我,APJifengc 表示他知道一些关于 \text{mex} 的东西,于是我去 A,APJifengc 去 J。

我发现 A 只有两队过,注意到 F 比乱西星上的空战简单,而且思维题交给两个 Ag 选手即可,于是开 F 大模拟。

APJifengc 过 J,fzj2007 过 H,我开始调 F,在 c++17 以下 vector 引用失效的典中典阴间错误上浪费了一会儿时间,让 APJifengc 帮忙测大样例(我的机子没有 c++17 而且会爆栈),WA 了,改,又 WA 了,改,过大样例了。

APJifengc 会 B 的双 \log,去写了,我交了 F,TLE 了,把 string 换成 int 加速比较,过了四十多个点又 TLE 了,不是你一个大模拟十几 MB 的输出量开 1s 是啥意思啊,我开始写快读快写,APJifengc B 写完了,也被卡常了,最后我快读快写没写完,APJifengc 也没卡过去,共通过 6 题,无缘决赛。

我还是很快乐的,因为我是被带飞的,但是 APJifengc 因为无缘决赛有点失落。

纪念一下我写的 F 吧,虽然没过。下载数据测试发现确实是被卡常了:

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m,k;
struct CMD{int t,h,x,y,z;};
vector<CMD>c;
int hs(string&s){
    if(s=="SLACKOFF") return 0;
    if(s=="MOVE") return 1;
    if(s=="SWAP") return 2;
    if(s=="MIRROR") return 3;
    if(s=="REPLACE") return 4;
    if(s=="ACTIVATE") return 5;
    return 6;
}
int getcmd(){
    string s;cin>>s;
    int _=hs(s);
    c.push_back({_,0,0,0,0});
    int r=c.size()-1;
    if(_==6){
        cin>>s,s.pop_back(),c[r].z=hs(s);
        int y=getcmd();c[r].h=y;
    }else if(_==4){
        cin>>c[r].h>>c[r].x,--c[r].x;
        int y=getcmd();c[r].y=y;
    }else if(_==1) cin>>c[r].h>>c[r].x;
    else if(_==2) cin>>c[r].h>>c[r].x>>c[r].y,--c[r].x,--c[r].y;
    else if(_==3) cin>>c[r].h>>c[r].x,--c[r].x;
    else if(_==5) cin>>c[r].h;
    return r;
}
struct BOT{
    int h[2],a[10],id;
    void act(int,bool);
    void chktri(int,bool);
}b[N];
void BOT::act(int x,bool tri){
    if(x==m) return;
//  cout<<"    ACT    "<<id<<"    "<<x<<".\n";
//  cout<<"    COMMAND ID = "<<(tri?::c[a[x]].h:a[x])<<".\n";
    CMD c=tri?::c[::c[a[x]].h]:(::c[a[x]]);
    if(c.t==0){
        cout<<"Robot "<<id<<" slacks off.\n";
        if(!--k) exit(0);
    }else if(c.t==1){
        h[c.h]=(h[c.h]+c.x)%n;
        cout<<"Robot "<<id<<" moves its "<<(c.h?"right":"left")<<" hand towards Robot "<<h[c.h]<<".\n";
        if(!--k) exit(0);
    }else if(c.t==2){
        swap(b[h[c.h]].a[c.x],a[c.y]);
        cout<<"Robot "<<id<<" swaps a line of command with Robot "<<h[c.h]<<".\n";
//      cout<<"    COMMANDS    ARE "<<c.x<<" "<<c.y<<".\n";
//      cout<<"    "<<::c[b[h[c.h]].a[c.x]].t<<".\n";
//      cout<<"    "<<::c[a[c.y]].t<<".\n";
        if(!--k) exit(0);
    }else if(c.t==3){
        int tar=b[h[c.h]].a[c.x];
        if(::c[tar].t==6){
            ::c.push_back(::c[tar]);
            int t=::c.size()-1;
            b[h[c.h]].a[c.x]=t;
            tar=t;
            ::c.push_back(::c[::c[tar].h]);
            t=::c.size()-1;
            ::c[t].h^=1,::c[tar].h=t;
        }else{
            ::c.push_back(::c[tar]);
            int t=::c.size()-1;
            ::c[t].h^=1,b[h[c.h]].a[c.x]=t;
        }
//      cout<<"    LRH = "<<h[0]<<" "<<h[1]<<".\n";
        cout<<"Robot "<<id<<" modifies a line of command of Robot "<<h[c.h]<<".\n";
        if(!--k) exit(0);
    }else if(c.t==4){
        b[h[c.h]].a[c.x]=c.y;
        cout<<"Robot "<<id<<" replaces a line of command of Robot "<<h[c.h]<<".\n";
        if(!--k) exit(0);
    }else if(c.t==5){
        cout<<"Robot "<<id<<" activates Robot "<<h[c.h]<<".\n";
        if(!--k) exit(0);
        b[h[c.h]].act(0,0);
    }
    if(!tri){
        if(c.t!=6&&h[1]!=id) b[h[1]].chktri(c.t,0);
        return act(x+1,0);
    }else if(h[1]!=id) b[h[1]].chktri(c.t,1);
}
void BOT::chktri(int t,bool ist){
//  cout<<"    TRI    "<<id<<".\n";
    for(int i=0;i<m;++i){
        CMD c=::c[a[i]];
        if(c.t==6){
            if(c.z==t) return act(i,1);
            else if(c.z==6&&ist) return act(i,1);
        }
    }
}
int main(){
//  freopen("A.in","r",stdin);
//  freopen("A.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>k;
    for(int i=0;i<n;++i){
        cin>>b[i].h[0]>>b[i].h[1],b[i].id=i;
        for(int j=0;j<m;++j) b[i].a[j]=getcmd();
    }
//  cout<<"    SIZE = "<<c.size()<<".\n";
//  for(auto x:c) cout<<x.t<<" "<<x.h<<" "<<x.x<<" "<<x.y<<" "<<x.z<<"\n";
    for(int i=0;;i=(i+1)%n) b[i].act(0,0);
    return 0;
}