55pts求救
查看原帖
55pts求救
977422
huangems楼主2025/8/29 14:15
#include<bits/stdc++.h>
#define fst first
#define sec second
#define mkp(a,b) make_pair(a,b)
#define usetime() (double)clock () / CLOCKS_PER_SEC * 1000.0
using namespace std;
typedef long long LL;
typedef pair<LL,int> pii;
const int maxn=155;
void read(int& x){
	char c;
	bool f=0;
	while((c=getchar())<48) f|=(c==45);
	x=c-48;
	while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
	x=(f ? -x : x);
}
void read(LL& x){
	char c;
	bool f=0;
	while((c=getchar())<48) f|=(c==45);
	x=c-48;
	while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
	x=(f ? -x : x);
}
struct edge{
	string name;
	int to;
};
pii d[maxn];
vector<edge> mp[maxn];
unordered_map<string,int> m;
unordered_map<string,pii> var;
set<pii> va;
int n;
int tot=0;
LL len=0;
LL mceil(LL x,LL y){
	if(x%y==0) return x/y;
	else return x/y+1;
}
int main(){
	freopen("P9754_7.in","r",stdin);
	freopen("wwa.out","w",stdout);
	read(n);
	int op,p;
	string s,a,b;
	LL ar;
	m["byte"]=++tot,d[tot]=mkp(1,1);
	m["short"]=++tot,d[tot]=mkp(2,2);
	m["int"]=++tot,d[tot]=mkp(4,4);
	m["long"]=++tot,d[tot]=mkp(8,8);//空间大小+对齐要求
	while(n--){
		read(op);
		if(op==1){
			cin>>s;
			m[s]=++tot;
			read(p);
			LL lst=0;
			d[tot].sec=0;
			while(p--){
				cin>>a>>b;
				mp[tot].push_back((edge){b,m[a]});
				d[tot].sec=max(d[tot].sec,d[m[a]].sec);
				lst=mceil(lst,d[m[a]].sec)*d[m[a]].sec+d[m[a]].fst;
			}
			d[tot].fst=lst;
			//cout<<"ans=";
			printf("%lld %d\n",d[tot].fst,d[tot].sec);
		}
		if(op==2){
			cin>>a>>b;
			var[b]=mkp(mceil(len,d[m[a]].sec)*d[m[a]].sec,m[a]);
			va.insert(var[b]);
			len=var[b].fst+d[m[a]].fst;
			//cout<<"ans=";
			printf("%lld\n",var[b].fst);
		}
		if(op==3){
			cin>>s;
			//cout<<"ans=";
			s.append(1,'.');
			int k=0;
			a.clear();
			while(s[k]!='.') a.append(1,s[k++]);
			int now=var[a].sec;
			LL ans=var[a].fst;
			a.clear();
			for(int i=k+1;i<(int)s.size();i++){
				if(s[i]=='.'){
					for(int j=0;j<(int)mp[now].size();j++){
						int v=mp[now][j].to;
						if(mp[now][j].name==a){
							ans=mceil(ans,d[v].sec)*d[v].sec;
							now=v;
							break;
						}
						else{
							ans=mceil(ans,d[v].sec)*d[v].sec+d[v].fst;
						}
					}
					a.clear();
				}
				else{
					a.append(1,s[i]);
				}
			}
			if(ans==1516||ans==2536) cout<<"wa::";
			printf("%lld\n",ans);
		}
		if(op==4){
			read(ar);
			//cout<<"ans=";
			vector<string> v;
			LL l=0;
			int now=0;
			for(auto i=va.begin();i!=va.end();i++){
				if(i->fst<=ar) l=i->fst,now=i->sec;
				else break;
			}
			for(auto i=var.begin();i!=var.end();i++){
				if(i->sec.fst==l){
					v.push_back(i->fst);
					break;
				}
			}
			if(!now){
				cout<<"ERR\n";
				continue;
			}
			while(now>4){
				int tp=-1;
				for(int j=0;j<(int)mp[now].size();j++){
					int v=mp[now][j].to;
					LL li=mceil(l,d[v].sec)*d[v].sec+d[v].fst;
					if(li>ar){
						l=mceil(l,d[v].sec)*d[v].sec,tp=j;
						break;
					}
					else{
						l=li;
					}
				}
				if(tp<0){
					l=-1e18;
					break;
				}
				v.push_back(mp[now][tp].name);
				now=mp[now][tp].to;
			}
			//cout<<now<<' '<<ar-l+1<<endl;
			l=mceil(l,d[now].sec)*d[now].sec;
			if(l>ar||ar-l>=d[now].fst){
				cout<<"ERR";
			}
			else{
				cout<<v[0];
				for(int i=1;i<(int)v.size();i++){
					cout<<'.'<<v[i];
				}
			}
			putchar('\n');
		}
	}
	return 0;
}
//^o^


提交记录

下载了 #7 的数据,发现是3,4操作有问题

2025/8/29 14:15
加载中...