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 表示他知道一些关于
我发现 A 只有两队过,注意到 F 比乱西星上的空战简单,而且思维题交给两个 Ag 选手即可,于是开 F 大模拟。
APJifengc 过 J,fzj2007 过 H,我开始调 F,在 c++17 以下 vector 引用失效的典中典阴间错误上浪费了一会儿时间,让 APJifengc 帮忙测大样例(我的机子没有 c++17 而且会爆栈),WA 了,改,又 WA 了,改,过大样例了。
APJifengc 会 B 的双 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;
}