CSP-S T3 样例全过,民间数据20pts求调
  • 板块学术版
  • 楼主_LX_
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/23 21:35
  • 上次更新2023/11/2 11:39:22
查看原帖
CSP-S T3 样例全过,民间数据20pts求调
590386
_LX_楼主2023/10/23 21:35
#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
#define int long long
int n,cz,tot=3,inctot,incsum;
struct Node{
	string name;//结构体名
	int k,maxsize,sum;//k:含有变量数量 maxsize:最大对齐规则 sum:总占用空间
	map<string,int>incmp;
	struct INC{
		string n;//n:变量名
		int t,l,r,s,ms;//t:类型 l:空间左边界 r:空间右边界 
	}inc[MAXN];//结构体内包含的变量
}node[MAXN];//自定义结构体(包括byte short int long)
map<string,int>strmp;//map用于对应类型在node中的位置(byte-0 short-1 int-2 long-3)
map<string,int>namemp;
struct INC{
	string n;
	int t,l,r,ms,s;
}inc[MAXN];
signed main(){
	// freopen("struct2.in","r",stdin);
	// freopen("struct.out","w",stdout);
	scanf("%lld",&n);
	strmp["byte"]=0,node[0].maxsize=1,node[0].sum=1;
	strmp["short"]=1,node[1].maxsize=2,node[1].sum=2;
	strmp["int"]=2,node[2].maxsize=4,node[2].sum=4;
	strmp["long"]=3,node[3].maxsize=8,node[3].sum=8;
	for(int I=0;I<n;I++){
		scanf("%lld",&cz);
		if(cz==1){
			cin>>node[++tot].name;
			scanf("%lld",&node[tot].k);
			strmp[node[tot].name]=tot;
			node[tot].sum=0;
			for(int i=0;i<node[tot].k;i++){
				string t;
				cin>>t>>node[tot].inc[i].n;
				// cout<<node[tot].inc[i].n;
				node[tot].inc[i].t=strmp[t];
				node[tot].inc[i].ms=node[node[tot].inc[i].t].maxsize;
				node[tot].inc[i].s=node[node[tot].inc[i].t].sum;
				node[tot].maxsize=max(node[tot].maxsize,node[tot].inc[i].ms);
				node[tot].inc[i].l=((node[tot].sum+node[tot].inc[i].ms-1)/node[tot].inc[i].ms)*node[tot].inc[i].ms;
				node[tot].inc[i].r=node[tot].inc[i].l+node[tot].inc[i].s-1;
				node[tot].sum=node[tot].inc[i].r+1;
				node[tot].incmp[node[tot].inc[i].n]=i;
			}
			node[tot].sum=((node[tot].sum+node[tot].maxsize-1)/node[tot].maxsize)*node[tot].maxsize;
			printf("%lld %lld\n",node[tot].sum,node[tot].maxsize);
		}//定义新的结构体
		else if(cz==2){
			string t;
			cin>>t>>inc[inctot].n;
			inc[inctot].t=strmp[t];
			inc[inctot].ms=node[inc[inctot].t].maxsize;
			inc[inctot].s=node[inc[inctot].t].sum;
			inc[inctot].l=((incsum+inc[inctot].ms-1)/inc[inctot].ms)*inc[inctot].ms;
			inc[inctot].r=inc[inctot].l+inc[inctot].s-1;
			incsum=inc[inctot].r+1;
			namemp[inc[inctot].n]=inctot;
			printf("%lld\n",inc[inctot].l);
			inctot++;
		}//定义新的变量
		else if(cz==3){
			string s,t="";
			cin>>s;
			int fd=0,mt;
			int i=0;
			for(;i<s.size();i++){
				if(s[i]=='.') break;
				else t+=s[i];
			}
			fd=inc[namemp[t]].l,mt=inc[namemp[t]].t;
			i++,t="";
			for(;i<s.size();i++){
				if(s[i]=='.'){
					fd+=node[mt].inc[node[mt].incmp[t]].l;
					t="";
					mt=node[mt].inc[node[mt].incmp[t]].t;
				}
				else t+=s[i];
			}
			fd+=node[mt].inc[node[mt].incmp[t]].l;
			printf("%lld\n",fd);
		}//访问某个元素
		else{
			bool f=1;
			string ans="";
			int fd=0;
			scanf("%lld",&fd);
			int mt;
			for(int i=0;i<inctot;i++){
				if(inc[i].l>fd) break;
				if(inc[i].l<=fd&&inc[i].r>=fd){
					mt=inc[i].t;
					ans+=inc[i].n;
					fd-=inc[i].l;
					f=0;
					break;
				}
			}
			if(f){
				printf("ERR\n");
				continue;
			}
			while(true){
				if(mt>=0&&mt<=3){
					f=0;
					cout<<ans<<endl;
					break;
				}
				f=1;
				for(int i=0;i<node[mt].k;i++){
					if(node[mt].inc[i].l>=fd) break;
					if(node[mt].inc[i].l<=fd&&node[mt].inc[i].r>=fd){
						ans+="."+node[mt].inc[i].n;
						mt=node[mt].inc[i].t;
						fd-=node[mt].inc[i].l;
						f=0;
						break;
					}
				}
				if(f){
					printf("ERR\n");
					break;
				}
			}
		}//访问某个内存地址
	}
	return 0;
}
2023/10/23 21:35
加载中...