MnZn 求助 S 组 T3
  • 板块学术版
  • 楼主diqiuyi奶龙
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 12:50
  • 上次更新2023/11/2 11:56:14
查看原帖
MnZn 求助 S 组 T3
324666
diqiuyi奶龙楼主2023/10/22 12:50

rt,全 RE,赛时一直没调出来

#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return f*x;
}
struct stt{
	ll siz,len;//元素个数,对齐 
	string nam[105],lx[105];//名,类型 
	map<string,int> mp;//成员对应编号 
	ll cd;
}x;
struct mem{
	string lx;//类型
	ll l,r;//所占区间 
};
map<string,stt> m;
map<string,mem> me;
map<string,int> nxt;
int n,opt,d;
string s,ss,sss;
ll mx=-1;
vector<pair<string,string> > g;
bool flag;
void ak(string a,ll val){
//	puts("fc");
	if(val<0){
		flag=1;
		return ;
	}
	ll now=0;
	stt b=m[me[a].lx];
	if(val>=b.cd){
		flag=1;
		return ;
	}
	nxt[a]=-1;
	for(int i=1;i<=b.siz;i++){
		ll now2=now+m[b.lx[i]].cd;
		now2=(now2+m[b.lx[i]].len-1)/m[b.lx[i]].len*m[b.lx[i]].len;
		if(now2>val){
			me[b.nam[i]].lx=b.lx[i];
			ak(b.nam[i],val-now);
			if(!flag) nxt[a]=i;
			break;
		}
		else now=now2;
	}
	if(nxt[a]==-1&&b.siz) flag=1;
}
int main(){
	freopen("struct.in","r",stdin);
	freopen("struct.out","w",stdout);
	n=read();
	m["byte"].len=m["byte"].cd=1,m["short"].len=m["short"].cd=2,m["int"].len=m["int"].cd=4,m["long"].len=m["long"].cd=8;
	while(n--){
		opt=read();
		if(opt==1){
			cin>>s,x.siz=read(),x.len=0,x.cd=0,x.mp.clear();
			for(int i=1;i<=x.siz;i++){
				cin>>x.lx[i]>>x.nam[i],x.mp[x.nam[i]]=i;x.len=max(x.len,m[x.lx[i]].len);
			}
//			puts("A");
			for(int i=1;i<=x.siz;i++)
				x.cd=((m[x.lx[i]].cd+x.cd+m[x.lx[i]].len-1)/m[x.lx[i]].len)*m[x.lx[i]].len;
//			puts("b");
			x.cd=(x.cd+x.len-1)/x.len*x.len;
			m[s]=x;
			printf("%lld %d\n",x.cd,x.len);
		}
		else if(opt==2)
			cin>>s>>ss,me[ss].lx=s,me[ss].l=mx+1,me[ss].r=mx+m[s].cd,g.push_back(make_pair(s,ss)),
			mx=(me[ss].r+m[s].len-1)/m[s].len*m[s].len-1,printf("%lld\n",me[ss].l);
		else if(opt==3){
			cin>>s,ss="";
			ll ans=0;
			for(int i=0;i<s.size();i++)
				if(s[i]^'.') ss+=s[i];
				else{
					ans=me[ss].l;
					break;
				}
//			cout<<ss<<'\n';
			sss="";
			for(int i=ss.size()+1;i<s.size();i++)
				if(s[i]^'.') sss+=s[i];
				else{
					x=m[me[ss].lx];
					int pos=x.mp[sss];
//					cout<<pos<<'\n';
					ll now=0;
					for(int j=1;j<pos;j++)
						now=((now+m[x.lx[j]].cd+m[x.lx[j]].len-1)/m[x.lx[j]].len)*m[x.lx[j]].len;
					now=(now+m[x.lx[pos]].len-1)/m[x.lx[pos]].len*m[x.lx[pos]].len;
					ans+=now;
					me[sss].lx=x.lx[pos];
					ss=sss,sss="";
				}
			x=m[me[ss].lx];
			int pos=x.mp[sss];
//			cout<<ss<<' '<<sss<<' '<<pos<<'\n';
			ll now=0;
			for(int j=1;j<pos;j++)
				now=((now+m[x.lx[j]].cd+m[x.lx[j]].len-1)/m[x.lx[j]].len)*m[x.lx[j]].len;
			now=(now+m[x.lx[pos]].len-1)/m[x.lx[pos]].len*m[x.lx[pos]].len;
			ans+=now;
			printf("%lld\n",ans);
		}
		else{
			d=read(),flag=0;
//			bool flg=0;
			for(int i=0;i<g.size();i++)
				if(me[g[i].second].r>=d){
					ak(g[i].second,d-me[g[i].second].l);
					if(!flag){
						s=g[i].second;
						cout<<s,s=m[me[s].lx].nam[nxt[s]];
						while(1){
							cout<<'.'<<s;
							if(~nxt[s]) s=m[me[s].lx].nam[nxt[s]];
							else break;
						}
						putchar(10);
					}
					else puts("ERR");
					break;
				}
			if(g.size()&&me[g[g.size()-1].second].r<d) puts("ERR");
//			printf("%d\n",n);
		}
	}
	return 0;
}
/*
5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10
*/
2023/10/22 12:50
加载中...