Guchenxi0971
2024-10-29 16:26:24
学校组织了一场所谓的提高模拟赛,坐牢
由于刚刚月考,寝室同学过于兴奋,同时由于紧张睡不着,熬到12点才迷迷糊糊的睡过去。这状态,学什么OI?
写去年的结构体保持手感,同时敲着电子木鱼积功德。由于头脑过于不清醒,差点把对齐规则看错,最后连写代调一遍过,花了
#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开一个结构体维护,方便处理。
*/
中午睡在机房,睡不了一点,又有点晕车,
座位左后方有一个水管,不停的哗哗哗的流水,补觉失败,只好起来打缺省源,写了modint
(但是没用上)。
14:30 开题,10分钟秒了 T1。
转眼看T2,这么这么萌,第一问直接前缀和,第二问就是一个简单的贪心,15:20写完提交。
50分钟两道题,优势在我,赶紧看 T3,一眼
看 T4,会不了一点,部分分也不想打就去检查前3题。
跑了 T3 的极限数据,
最后预估
出了考场,问了同机房的同学,基本都是
凭借记忆默写了前二题的代码(T3写的太恶心了,
可恶的 CCF 推测出成绩。
最后得分 100+100+75+0 未达到大众分,遗憾离场。