【悬关】S 组 T3 代码求调
  • 板块学术版
  • 楼主Lovely_Elaina
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/23 19:21
  • 上次更新2023/11/2 11:41:27
查看原帖
【悬关】S 组 T3 代码求调
781159
Lovely_Elaina楼主2023/10/23 19:21
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 105;

int op,k,addr;
string s,t,n;

struct node{
	string name; 
	int len,size;
	int k,it[N];
	string it_s[N];
}a[N];

int pre = 4;
map<string,int > tt;

int len = 0;
struct point{
	string name;
	int idx; // node
	int l,r;
}b[N];

map<string,int > nn;

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	tt["byte"] = 1;
	tt["short"] = 2;
	tt["int"] = 3;
	tt["long"] = 4;
	
	a[1] = {"byte",1,1,0,{0},{""}};
	a[2] = {"short",2,2,0,{0},{""}};
	a[3] = {"int",4,4,0,{0},{""}};
	a[4] = {"long",8,8,0,{0},{""}};
	
	b[0].r = -1;
	
	int T;
	cin >> T;
	while(T--){
		cin >> op;
		if(op == 1){
			cin >> s >> k;
			
			pre++;
			tt[s] = pre;
			a[pre].name = s;
			a[pre].k = k;
			
			int size=0,len=0;
			for(int i = 1; i <= k; i++){
				cin >> t >> n;
				a[pre].it[i] = tt[t];
				a[pre].it_s[i] = n;
				len = max(len,a[a[pre].it[i]].len);
				size = ((size%a[a[pre].it[i]].len==0?0:1)+size/a[a[pre].it[i]].len+1)*a[a[pre].it[i]].len;
			}
			
			a[pre].len = len;
			a[pre].size = size;
			cout << size << ' ' << len << '\n';
		}else if(op == 2){
			cin >> t >> n;
			
			len++;
			nn[n] = len;
			b[len].name = n;
			b[len].idx = tt[t];
			
			int lv = a[b[len].idx].len;
			if(len == 1){
				b[len].l = 0;
				b[len].r = a[b[len].idx].size - 1;
			}else{
				int size = a[b[len].idx].size;
				b[len].l = (((b[len-1].r+1)%size==0?0:1)+(b[len-1].r+1)/size)*size;
				b[len].r = b[len].l-1+size;
			}
			cout << b[len].l << '\n';
		}else if(op == 3){
			cin >> s;
			if(s.find('.') == -1){
				cout << b[nn[s]].l << '\n';
				continue;
			}
			
			int res = 0;
			int fi = s.find('.');
			string na = s.substr(0,fi);
			s.erase(0,fi+1);
			res = b[nn[na]].l;
			int ind = b[nn[na]].idx;
			
			res++;
			
			while(s.find('.') != -1){
				int fi = s.find('.');
				na = s.substr(0,fi);
				s.erase(0,fi+1);
				
				for(int i = 1; i <= a[ind].k; i++){
					if(a[ind].it_s[i] != na){
						res = ((res%a[a[ind].it[i]].size==0?0:1)+res/a[a[ind].it[i]].size)*a[a[ind].it[i]].size;
					}
					ind = a[ind].it[i];
					break;
				}
			}
			
			for(int i = 1; i <= a[ind].k; i++){
				if(a[ind].it_s[i] != na){
					res = ((res%a[a[ind].it[i]].size==0?0:1)+res/a[a[ind].it[i]].size)*a[a[ind].it[i]].size;
				}
			}
			cout << res << '\n';
		}else{
			cin >> addr;
			if(addr > b[len].r){
				cout << "ERR\n";
				continue;
			}
			
			string ans = "";
			bool wind_kaka = true;
			for(int i = 1; i <= len; i++){
				if(b[i].l <= addr && addr <= b[i].r){
					if(b[i].idx <= 4){
						wind_kaka = false;
						ans += b[i].name;
						break;
					}else{
						ans = b[i].name + '.';
						int now = b[i].l;
						int idx = b[i].idx;
						while(idx > 4 && wind_kaka){
							for(int i = 1; i <= a[idx].k; i++){
								// cout << i << " ";
								int ppp = ((now%a[a[idx].it[i]].size==0?0:1)+now/a[a[idx].it[i]].size+1)*a[a[idx].it[i]].size;
								// cout << ppp << ' ';
								if(ppp >= addr){
									if(a[idx].it[i]<= 4){
										ans = ans + a[idx].it_s[i];
										wind_kaka = false;
										break;
									}
									ans = ans + b[i].name + '.';
									idx = a[idx].it[i];
									break;
								}
								now = ppp;
							}
							break;
						}
					}
					break;
				}
			}
			
			if(wind_kaka) cout << "ERR\n";
			else cout << ans << '\n';
		}
	}
	
	return 0;
}

op = 4 处理肯定有问题

2023/10/23 19:21
加载中...