dalao救救蒟蒻吧(AC必关
查看原帖
dalao救救蒟蒻吧(AC必关
932094
caoruiqi楼主2025/7/28 13:57

调了一上午+一中午我人直接炸了。

好像是操作四有问题,判ERR判多了。

//#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,bmi,bmi2,fma")
#include<bits/stdc++.h>
using namespace std;
long long max(long long a,long long b){
	return a>b?a:b;
}
long long min(long long a,long long b){
	return a<b?a:b;
}
#ifndef __unix__
#define getchar_unlocked _getchar_nolock
#endif
inline long long read(){
	long long x=0,f=1;
	char c=getchar_unlocked();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar_unlocked();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar_unlocked();
	}
	return x*f;
}
void write(long long x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
	return;
}
long long n,i,j,op,k,addr,addres,num;
map<string,tuple<string,string,long long> > q[101];
map<string,long long> len,sum,requ,fir,sum1;
map<string,string> typ;
string ss[101];
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	requ["byte"]=1;
	requ["short"]=2;
	requ["int"]=4;
	requ["long"]=8;
	sum["byte"]=1;
	sum["short"]=2;
	sum["int"]=4;
	sum["long"]=8;
	sum1["byte"]=1;
	sum1["short"]=2;
	sum1["int"]=4;
	sum1["long"]=8;
	n=read();
	addres=-1;
	for(i=1;i<=n;i++){
		op=read();
		if(op==1){
			string s;
			cin>>s;
			requ[s]=0;
			len[s]=0;
			long long l=-1;
			k=read();
			while(k--){
				string s1,s2;
				cin>>s1>>s2;
				if((l+1)%requ[s1]==0){
					q[++len[s]][s]={s1,s2,l+1};
					l+=sum[s1];
				}
				else{
					q[++len[s]][s]={s1,s2,l+1-(l+1)%requ[s1]+requ[s1]};
					l=l+1-(l+1)%requ[s1]+requ[s1]+sum[s1]-1;
				}
				requ[s]=max(requ[s],requ[s1]);
			}
			sum1[s]=l;
			sum[s]=ceil((l+1)*1.0/requ[s])*requ[s];
			write(sum[s]);
			putchar(' ');
			write(requ[s]);
			puts("");
		}
		else if(op==2){
			string s1,s2;
			cin>>s1>>s2;
			ss[++num]=s2;
			typ[s2]=s1;
			if((addres+1)%requ[s1]==0){
				fir[s2]=addres+1;
				write(addres+1);
				puts("");
				addres+=sum[s1];
			}
			else{
				fir[s2]=addres+1-(addres+1)%requ[s1]+requ[s1];
				write(addres+1-(addres+1)%requ[s1]+requ[s1]);
				puts("");
				addres=addres+1-(addres+1)%requ[s1]+requ[s1]+sum[s1]-1;
			}
		}
		else if(op==3){
			string s,tmp,pre;
			cin>>s;
			long long l=s.size();
			queue<string> p;
			for(j=0;j<l;j++){
				if(s[j]!='.'){
					tmp+=s[j];
				}
				else{
					p.push(tmp);
					tmp="";
				}
			}
			p.push(tmp);
			long long ans;
			ans=fir[p.front()];
			pre=typ[p.front()];
			while(!p.empty()){
				tmp=p.front();
				p.pop();
				if(pre=="byte"||pre=="short"||pre=="int"||pre=="long"||p.empty()){
					break;
				}
				for(j=1;j<=len[pre];j++){
					if(get<1>(q[j][pre])==p.front()){
						ans+=get<2>(q[j][pre]);
						pre=get<0>(q[j][pre]);
						break;
					}
				}
			}
			write(ans);
			puts("");
		}
		else{
			addr=read();
			string tmp,pre;
			for(j=1;j<=num;j++){
				if(fir[ss[j]]<=addr&&fir[ss[j]]+sum1[typ[ss[j]]]>addr){
					tmp=ss[j];
					break;
				}
			}
			if(j>num){
				puts("ERR");
			}
			else{
				long long ans=fir[tmp];
				bool pd=0;
				queue<string> p;
				pre=typ[tmp];
				while(1){
					p.push(tmp);
					if(pre=="byte"||pre=="short"||pre=="int"||pre=="long"){
						pd=1;
						break;
					}
					long long l=len[pre];
					for(j=1;j<=len[pre];j++){
						if(ans+get<2>(q[j][pre])<=addr&&ans+get<2>(q[j][pre])+sum1[get<0>(q[j][pre])]>addr){
							ans+=get<2>(q[j][pre]);
							tmp=get<1>(q[j][pre]);
							pre=get<0>(q[j][pre]);
							break;
						}
					}
					if(j>l){
						break;
					}
				}
				if(pd){
					cout<<p.front();
					p.pop();
					while(!p.empty()){
						cout<<'.'<<p.front();
						p.pop();
					}
					puts("");
				}
				else{
					puts("ERR");
				}
			}
		}
	}
	return 0;
}
2025/7/28 13:57
加载中...