CSP2024 游记

Guchenxi0971

2024-10-29 16:26:24

Life & Travel

Day 998244352

学校组织了一场所谓的提高模拟赛,坐牢 4h,T1数论+DS会不了一点,T4写了假DP,50pts遗憾离场,RP掉光了。

由于刚刚月考,寝室同学过于兴奋,同时由于紧张睡不着,熬到12点才迷迷糊糊的睡过去。这状态,学什么OI?

Day 1 上午

写去年的结构体保持手感,同时敲着电子木鱼积功德。由于头脑过于不清醒,差点把对齐规则看错,最后连写代调一遍过,花了 1h,我去年考场上可是胡了 3h 然后 0pts 呀。不说别的,这一年码力至少有长进。

#include <bits/stdc++.h> 
#define int long long
#define pis pair<int,string>
#define mk make_pair
#define se second
#define fi first
using namespace std;
const int Max=140;

inline int read(){
    int res=0,v=1;
    char c=getchar();
    while(c<'0'||c>'9'){v=(c=='-'?-1:1);c=getchar();}
    while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+(c^48);c=getchar();}
    return res*v;
}

map<string,int>Id;  //将jgt的名称转换为定义的顺序 

struct Str{

    string Nam;
    int num,len,lim;     
    int str[Max],end[Max];
    pis nam[Max];
    //Nam表示其名字 
    //num元素个数,len结构体长度,lim对齐要求 
    //nam[i]表示第i个元素的编号和名字,若小于等于4表示为基本元素
    //str[i]表示第i个元素的起始位置 
    //end[i]表示第i个元素的终止位置
}st[Max]; 

int tot;

void Declar(){
    ++tot;
    cin>>st[tot].Nam;
    Id[st[tot].Nam]=tot;st[tot].num=read();
    for(int i=1;i<=st[tot].num;++i){
        string II;cin>>II;
        st[tot].nam[i].fi=Id[II];
        cin>> st[tot].nam[i].se;
        int x=Id[II];
        int b=((-st[tot].len)%st[x].lim+st[x].lim)%st[x].lim;
        st[tot].len+=b;st[tot].str[i]=st[tot].len;
        st[tot].len+=st[x].len;st[tot].end[i]=st[tot].str[i]+st[x].len-1;
        st[tot].lim=max(st[tot].lim,st[x].lim);
    }
    int b=((-st[tot].len)%st[tot].lim+st[tot].lim)%st[tot].lim;
    st[tot].len+=b;
    cout << st[tot].len << ' ' << st[tot].lim << "\n";
}

void pre(){
    Id["byte"]=++tot;st[tot].lim=1;st[tot].num=1;st[tot].nam[1]=mk(1,0);st[tot].str[1]=0;st[tot].end[1]=0;st[tot].len=1;
    Id["short"]=++tot;st[tot].lim=2;st[tot].num=1;st[tot].nam[1]=mk(2,0);st[tot].str[1]=0;st[tot].end[1]=1;st[tot].len=2;
    Id["int"]=++tot;st[tot].lim=4;st[tot].num=1;st[tot].nam[1]=mk(3,0);st[tot].str[1]=0;st[tot].end[1]=3;st[tot].len=4;
    Id["long"]=++tot;st[tot].lim=8;st[tot].num=1;st[tot].nam[1]=mk(4,0);st[tot].str[1]=0;st[tot].end[1]=7;st[tot].len=8;
}

int Now;//表示定义时的位置

struct Pos{
    int id,str,end;
    string nam;
    //id表示其类型,str表示其起始位置,end为终止位置 
    //nam为姓名 
};

vector<Pos>que;

void init(){
    string Nam,nam;
    cin>> Nam>>nam;
    Pos now;
    now.id=Id[Nam];now.nam=nam;
    int Lim=st[now.id].lim;
    int d=(((-Now)%Lim+Lim)%Lim);
    Now+=d;now.str=Now;now.end=Now+st[now.id].len-1;
    Now+=st[now.id].len;
    que.push_back(now);
    cout << now.str << "\n";
}

queue<string>ans; 
int tag=0;

void Work4(int id,int str,int len){//id表示是哪个jgt,st表示当前的起始位置,len表示询问的终止位置 
    for(int i=1;i<=st[id].num;++i){
        if(st[id].str[i]+str>len){tag=1;return;}
        if(st[id].end[i]+str>=len){
            ans.push(st[id].nam[i].se);
            if(st[id].nam[i].fi<=4)return;
            Work4(st[id].nam[i].fi,str+st[id].str[i],len);
            return;
        }
    }
    tag=1;
}

void Query4(){
    int num=read();
    tag=0;while(!ans.empty())ans.pop();
    int z=0;
    for(auto i:que){
        if(i.str>num){cout << "ERR\n";return;}
        if(i.end>=num){
            z=1;
            ans.push(i.nam);
            if(i.id<=4)break;
            Work4(i.id,i.str,num);break;
        }
    }
    if(tag||!z)cout << "ERR\n" ;
    else {
        while(!ans.empty()){
            cout << ans.front();ans.pop();
            if(!ans.empty())cout << ".";
        }
        cout << "\n";
    }

}

queue<string>Que;
void Work3(int id,int str){
    for(int i=1;i<=st[id].num;++i){
        if(st[id].nam[i].se==Que.front()){
            Que.pop();
            if(!Que.size())cout << str+st[id].str[i] << "\n";
            else Work3(st[id].nam[i].fi,str+st[id].str[i]);
            break;
        }
    }
}

void Query3(){
    string nam;
    cin>> nam;
    int n=nam.size();
    string a="",b="";
    for(int i=0;i<n;++i){
        if(nam[i]!='.')a=a+nam[i];
        else Que.push(a),a=b;
    }
    Que.push(a);
    for(auto i:que){
        if(i.nam==Que.front()){
            Que.pop();
            if(!Que.size())cout << i.str << "\n";
            else Work3(i.id,i.str);
            break;
        }
    }
}

signed main(){
    int n=read();pre();
    for(int i=1;i<=n;++i){
        int op=read();
        if(op==1)Declar();
        if(op==2)init();
        if(op==3)Query3();
        if(op==4) Query4();
    }
    return 0;
}

/*
具体思路如下:
将基本类型也看作结构体,那么定义就是结构体套结构体,
对每个jgt开一个结构体维护,方便处理。 
*/

中午睡在机房,睡不了一点,又有点晕车,Debuff 叠满。

Day 1下午

座位左后方有一个水管,不停的哗哗哗的流水,补觉失败,只好起来打缺省源,写了modint(但是没用上)。

14:30 开题,10分钟秒了 T1。

转眼看T2,这么这么萌,第一问直接前缀和,第二问就是一个简单的贪心,15:20写完提交。

50分钟两道题,优势在我,赶紧看 T3,一眼 O(n^2)dp,考虑优化,想到了一个 O(n\log n) 的,开始码。写了4棵线段树,花了2h,中间假了好几次。还好最后得到的 4kb 代码过了大样例,随即上拍。

看 T4,会不了一点,部分分也不想打就去检查前3题。

跑了 T3 的极限数据,3s,这么慢?发现一次 dp 转移使用了 12 次线段树操作,不 T 才怪呢。可能是看长题目太久了,身体感到不适,有点想吐就不打算改了,而且时间不多了,重新推式子也来不及了。

最后预估 200+ 遗憾离场。

出了考场,问了同机房的同学,基本都是 300+。我好菜,是不是要退役了QAQ。

Day 2

凭借记忆默写了前二题的代码(T3写的太恶心了,4kb的抽象玩意儿)还好洛谷上过了,要是再挂分了电脑也该格了。看到 T4 是黑题,心里平衡了不少。

Day inf

可恶的 CCF 推测出成绩。

最后得分 100+100+75+0 未达到大众分,遗憾离场。