S组T3 求调
  • 板块灌水区
  • 楼主康立扬
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/24 12:38
  • 上次更新2023/11/2 11:36:57
查看原帖
S组T3 求调
251811
康立扬楼主2023/10/24 12:38

rt,只对了D性质

#include <bits/stdc++.h>
#define int long long 
using namespace std;
int read(){
	int s=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		s=s*10+(ch-'0');
		ch=getchar();
	}
	return s*f;
}
struct node{
	string typ,s;
	int l,r;
};
map<string,vector<node> >mp;
map<string,int>siz,dq;
int n;
string s,t,p,rt;
vector<node>tmp;
map<string,bool>check;
signed main(){
	dq["byte"]=1,siz["byte"]=1;
	dq["short"]=2,siz["short"]=2;
	dq["int"]=4,siz["int"]=4;
	dq["long"]=8,siz["long"]=8;
	check["byte"]=1;
	check["short"]=1;
	check["int"]=1;
	check["long"]=1;
	n=read();
	while(n--){
		int op=read();
		if(op==1){
			cin>>s;
			int k=read();
			tmp.resize(k);tmp.shrink_to_fit();
			for(node &v:tmp){
				cin>>v.typ>>v.s;
				dq[s]=max(dq[s],dq[v.typ]);
			}
			tmp[0].l=0,tmp[0].r=siz[tmp[0].typ]-1;
			for(int i=1;i<k;i++)
				tmp[i].l=(tmp[i-1].r/dq[s]+1)*dq[s],
				tmp[i].r=tmp[i].l+siz[tmp[i].typ]-1;
			siz[s]=(tmp.back().r/dq[s]+1)*dq[s];
			mp[s]=tmp;
			printf("%lld %lld\n",siz[s],dq[s]);
		}
		if(op==2){
			cin>>t>>p;
			mp[""].push_back({t,p,0,0});
			dq[""]=max(dq[""],dq[t]);
			tmp=mp[s=""];
			tmp[0].l=0,tmp[0].r=siz[tmp[0].typ]-1;
			for(int i=1;i<(int)tmp.size();i++)
				tmp[i].l=(tmp[i-1].r/dq[s]+1)*dq[s],
				tmp[i].r=tmp[i].l+siz[tmp[i].typ]-1;
			siz[s]=(tmp.back().r/dq[s]+1)*dq[s];
			mp[s]=tmp;
			printf("%lld\n",tmp.back().l);
		}
		if(op==3){
			cin>>s;
			int res=0;
			s.push_back('.');
			t="";
			rt="";
			for(int i=0;i<(int)s.size();i++){
				if(s[i]=='.'){
					tmp=mp[rt];
					for(int j=0;j<(int)tmp.size();j++)
						if(tmp[j].s==t){
							res+=tmp[j].l;
							rt=tmp[j].typ;
							break;
						}
					t="";
				}
				else t.push_back(s[i]);
			}
			printf("%lld\n",res);
		}
		if(op==4){
			int res=read();
			string rt="";
			s="";
			for(;!check.count(rt);){
				tmp=mp[rt];
				for(int j=0;j<=(int)tmp.size();j++)
					if(j==(int)tmp.size()||tmp[j].l>res){
//						printf("%lld %lld %lld\n",j,e[rt][j-1].r,e[rt][j].l);
						if(j==0||res>tmp[j-1].r) {
							puts("ERR");
							goto ex;
						}	
						s+=tmp[j-1].s;
						s.push_back('.');
						res-=tmp[j-1].l,rt=tmp[j-1].typ;
						break;
					}
			}
			s.pop_back();
			printf("%s\n",s.c_str());
			ex:;
		}
	}
	return 0;
}
2023/10/24 12:38
加载中...