S组T3前两个点WA了的代码求调
  • 板块学术版
  • 楼主ysy0326
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 19:12
  • 上次更新2023/11/2 11:50:08
查看原帖
S组T3前两个点WA了的代码求调
571887
ysy0326楼主2023/10/22 19:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=105;
int n,cnt,k[maxn],tot,o[maxn][maxn],sta[maxn][maxn],len[maxn][maxn],a[maxn][maxn],num[maxn],A[maxn],St[maxn];
string s,st[maxn][maxn],op[maxn],Op[maxn][maxn],q[maxn];
map<string,int>Id,id,ID[maxn];
int read(){
	int ret=0,y=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') y=-y;ch=getchar();}
	while(isdigit(ch)) ret=(ret<<1)+(ret<<3)+(ch&15),ch=getchar();
	return ret*y;
}
signed main(){
//	freopen("struct.in","r",stdin);
//	freopen("struct.out","w",stdout);
	n=read();num[1]=1;num[2]=2;num[3]=4;num[4]=8;cnt=4;
	Id["byte"]=1;Id["short"]=2;Id["int"]=3;Id["long"]=4;
	A[1]=1;A[2]=2;A[3]=4;A[4]=8;
	while(n--){
		int opt=read();
		if(opt==1){
			cin>>s;k[cnt+1]=read();cnt++;int Maxlen=0,Maxa=0;
			for(int i=1;i<=k[cnt];i++){
				cin>>Op[cnt][i]>>st[cnt][i];
				ID[cnt][st[cnt][i]]=i;
				len[cnt][i]=num[Id[Op[cnt][i]]];
				a[cnt][i]=A[Id[Op[cnt][i]]];
				Maxa=max(Maxa,a[cnt][i]=A[Id[Op[cnt][i]]]);
			}
			A[cnt]=Maxa;
			o[cnt][1]=0;
			for(int i=2;i<=k[cnt];i++){
				int L=o[cnt][i-1]+len[cnt][i-1];
				o[cnt][i]=((L+a[cnt][i]-1)/a[cnt][i])*a[cnt][i];
			}
			num[cnt]=((o[cnt][k[cnt]]+len[cnt][k[cnt]]+A[cnt]-1)/A[cnt])*A[cnt];
			Id[s]=cnt;
			printf("%lld %lld\n",num[cnt],A[cnt]);
		}else if(opt==2){
			cin>>op[++tot]>>q[tot];id[q[tot]]=tot;
			if(tot==1) St[tot]=0;
			else{
				St[tot]=((St[tot-1]+num[Id[op[tot-1]]]+A[Id[op[tot]]]-1)/A[Id[op[tot]]])*A[Id[op[tot]]];
			}
			printf("%lld\n",St[tot]);
		}else if(opt==3){
			string now;int ans=0,nowid=0;
			cin>>now;int s_size=now.size();bool flg=0;
			for(int i=0;i<s_size;i++){
				string nw="";
				int j=i;
				while(j<s_size&&now[j]!='.') nw=nw+now[j],j++;
				int K;
				if(!flg){
					K=id[nw];
					nowid=Id[op[K]];
					ans=St[K];
					flg=1;
				}else{
					for(int i=1;i<=k[nowid];i++){
						if(st[nowid][i]==nw){
							ans+=o[nowid][i];
							nowid=Id[Op[nowid][i]];
							break;
						}
					}
				}
				i=j;
			}
			printf("%lld\n",ans);
		}else{
			int now=read();
			int L_=1,R_=tot,Now=0;bool flg=1;
			string ans="";
			while(L_<=R_){
				int mid=L_+R_>>1;
				if(St[mid]<=now&&now<=St[mid]+num[Id[op[mid]]]){Now=Id[op[mid]];ans=q[mid];now-=St[mid];break;}
				if(St[mid]+num[Id[op[mid]]]<=now&&now<St[mid+1]){flg=0;break;}
				if(now<St[mid]) R_=mid-1;
				else L_=mid+1;
			}
			if(!flg){puts("ERR");continue;}
			if(!Now){puts("ERR");continue;}
			while(Now>4){
				L_=1;R_=k[Now];bool tag=0;
//				printf("%lld %lld\n",L_,R_);
				while(L_<=R_){
					int mid=L_+R_>>1;
					if(o[Now][mid]<=now&&now<o[Now][mid]+num[Id[Op[Now][mid]]]){
						now-=o[Now][mid];
						ans=ans+"."+st[Now][mid];
						Now=Id[Op[Now][mid]];
						tag=1;break;
					}
					if(o[Now][mid+1]>now&&now>=o[Now][mid]+num[Id[Op[Now][mid]]]){flg=0;break;}
					if(now<o[Now][mid]) R_=mid-1;
					else L_=mid+1;
				}
				if(!tag){flg=0;break;}
				if(!flg) break;
			}
			if(!flg){puts("ERR");continue;}
			if(now>=num[Now]) puts("ERR");
			else cout<<ans<<'\n';
		}
	}
	return 0;
}
2023/10/22 19:12
加载中...