95pts WA求调
查看原帖
95pts WA求调
679775
RandomLife楼主2023/11/11 10:52
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
struct Son{
	string type,name;
	long long start,end;
};
struct Struct{
	int k=0;
	long long req,memory;
	string name;
	Son son[N];
};
struct def{
	string type,name;
	long long start;
}t[N];
int n,tot=0;
map<string,Struct>s;
vector<string>ss;
long long solve(long long x,long long d){
	return(x+d-1)/d*d;
}
int main(){
	s["byte"].req=s["byte"].memory=1;
	s["short"].req=s["short"].memory=2;
	s["int"].req=s["int"].memory=4;
	s["long"].req=s["long"].memory=8;
	cin>>n;
	while(n--){
		int op;
		cin>>op;
		if(op==1){
			Struct st,son;
			cin>>st.name>>st.k;
			st.req=st.memory=0;
			for(int i=1;i<=st.k;++i){
				cin>>st.son[i].type>>st.son[i].name;
				Struct son=s[st.son[i].type];
				if(i==1)st.son[i].start=0;
				else st.son[i].start=solve(st.son[i-1].start+s[st.son[i-1].type].memory,son.req);
				st.son[i].end=st.son[i].start+son.memory-1,st.req=max(st.req,son.req);
			}
			st.memory=solve(st.son[st.k].start+s[st.son[st.k].type].memory,st.req);
			s[st.name]=st;
			printf("%lld %lld\n",st.memory,st.req);
		}else if(op==2){
			tot++;
			cin>>t[tot].type>>t[tot].name;
			if(tot==1)t[tot].start=0;
			else t[tot].start=solve(t[tot-1].start+s[t[tot-1].type].memory,s[t[tot].type].req);
			printf("%lld\n",t[tot].start);
		}else if(op==3){
			ss.clear();
			string str,str2="";
			Struct st;
			long long ans;
			cin>>str;
			for(int i=0;i<str.size();++i)
				if(str[i]=='.')ss.push_back(str2),str2="";
				else str2.push_back(str[i]);
			ss.push_back(str2);
			for(int i=1;i<=tot;++i)
				if(t[i].name==ss[0]){
					st=s[t[i].type],ans=t[i].start;
					break;
				}
			for(int i=1;i<ss.size();++i)
				for(int j=1;j<=st.k;++j)
					if(st.son[j].name==ss[i]){
						ans+=st.son[j].start,st=s[st.son[j].type];
						break;
					}
			printf("%lld\n",ans);
		}else{
			long long addr;
			Struct st;
			string ans;
			cin>>addr;
			for(int i=1;i<=tot;++i)
				if(t[i].start<=addr&&(i==tot||t[i+1].start>addr)){
					ans+=t[i].name,st=s[t[i].type],addr-=t[i].start;
					break;
				}
			if(ans==""){
				puts("ERR");
				continue;
			}
			bool flag;
			while(st.k){
				flag=false;
				for(int i=1;i<=st.k;++i)
					if(st.son[i].start<=addr&&st.son[i].end>=addr){
						ans+="."+st.son[i].name,addr-=st.son[i].start,st=s[st.son[i].type];
						break;
					}else if(i==st.k){
						flag=true;
						break;
					}
				if(flag)break;
			}
			if(flag||st.memory<=addr)puts("ERR");
			else cout<<ans<<endl;
		}
	}
	return 0;
}
2023/11/11 10:52
加载中...