S组T3求调
  • 板块学术版
  • 楼主ZnPdCo
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/24 12:44
  • 上次更新2023/11/2 11:36:55
查看原帖
S组T3求调
560700
ZnPdCo楼主2023/10/24 12:44

rt,70pts

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
#define ll long long
using namespace std;
ll n;
struct node {
	string s;
	ll k;
	ll siz, kind;
	string t[110], n[110];
	ll st[110], ed[110];
} a[110];
ll cnt;
ll Ti;
void query(string x, ll pos, ll shift, ll start) {
	if(start >= x.length()) {
		cout << shift << '\n';
	}
	string str;
	for(ll i = start; i < x.length(); i++) {
		if(x[i] == '.') {
			start = i + 1;
			break;
		}
		str += x[i];
	}
	
	for(ll i = 1; i <= a[pos].k; i++) {
		if(a[pos].n[i] == str) {
			if(a[pos].t[i] == "byte" || a[pos].t[i] == "int" || a[pos].t[i] == "long" || a[pos].t[i] == "short") {
				cout << shift + a[pos].st[i] << '\n';
			}
			for(ll j = 1; j <= cnt; j++) {
				if(a[j].s == a[pos].t[i]) {
					query(x, j, shift + a[pos].st[i], start);
					break;
				}
			}
		}
	}
}
void query2(ll q, ll pos, string path) {
	for(ll i = 1; i <= a[pos].k; i++) {
		if(a[pos].st[i] <= q && q <= a[pos].ed[i]) {
			if(a[pos].t[i] == "byte" || a[pos].t[i] == "int" || a[pos].t[i] == "long" || a[pos].t[i] == "short") {
				cout << path + '.' + a[pos].n[i] << '\n';
			}
			for(ll j = 1; j <= cnt; j ++) {
				if(a[j].s == a[pos].t[i]) {
					if(pos != 0) query2(q-a[pos].st[i], j, path + '.' + a[pos].n[i]);
					else query2(q-a[pos].st[i], j, a[pos].n[i]);
				}
			}
			return;
		}
	}
	printf("ERR\n");
}
int main() {
	a[0].kind = 0;
	a[0].siz = 0;
	scanf("%lld", &n);
	while(n--) {
		ll op;
		scanf("%lld", &op);
		switch(op) {
			case 1: {
				cnt++;
				cin >> a[cnt].s >> a[cnt].k;
				a[cnt].kind = 0;
				ll ti = 0;
				for(ll i = 1; i <= a[cnt].k; i++) {
					cin >> a[cnt].t[i] >> a[cnt].n[i];
					if(a[cnt].t[i] == "byte") {
						a[cnt].kind = max(a[cnt].kind, 1ll);
						a[cnt].st[i] = ti;
						a[cnt].ed[i] = ti;
						ti++;
					} else if(a[cnt].t[i] == "short") {
						a[cnt].kind = max(a[cnt].kind, 2ll);
						if(ti % 2) ti += (2 - ti % 2);
						a[cnt].st[i] = ti;
						a[cnt].ed[i] = a[cnt].st[i]+1;
						ti+=2;
					} else if(a[cnt].t[i] == "int") {
						a[cnt].kind = max(a[cnt].kind, 4ll);
						if(ti % 4) ti += (4 - ti % 4);
						a[cnt].st[i] = ti;
						a[cnt].ed[i] = a[cnt].st[i]+3;
						ti+=4;
					} else if(a[cnt].t[i] == "long") {
						a[cnt].kind = max(a[cnt].kind, 8ll);
						if(ti % 8) ti += (8 - ti % 8);
						a[cnt].st[i] = ti;
						a[cnt].ed[i] = a[cnt].st[i]+7;
						ti+=8;
					} else {
						for(ll j = 1; j < cnt; j++) {
							if(a[j].s == a[cnt].t[i]) {
								a[cnt].kind = max(a[cnt].kind, a[j].kind);
								if(ti % a[j].kind) ti += (a[j].kind - ti % a[j].kind);
								a[cnt].st[i] = ti;
								a[cnt].ed[i] = a[cnt].st[i]+a[j].siz-1;
								ti+=a[j].siz;
							}
						}
					}
				}
				if(ti % a[cnt].kind) ti += (a[cnt].kind - ti % a[cnt].kind);
				a[cnt].siz = ti;
				cout << a[cnt].siz << ' ' << a[cnt].kind << '\n';
				break;
			}
			case 2: {
				a[0].k++;
				cin >> a[0].t[a[0].k] >> a[0].n[a[0].k];
				if(a[0].t[a[0].k] == "byte") {
					a[0].kind = max(a[0].kind, 1ll);
					cout << Ti << '\n';
					a[0].st[a[0].k] = Ti;
					a[0].ed[a[0].k] = Ti;
					Ti++;
				} else if(a[0].t[a[0].k] == "short") {
					a[0].kind = max(a[0].kind, 2ll);
					if(Ti % 2) Ti += (2 - Ti % 2);
					cout << Ti << '\n';
					a[0].st[a[0].k] = Ti;
					a[0].ed[a[0].k] = a[0].st[a[0].k]+1;
					Ti+=2;
				} else if(a[0].t[a[0].k] == "int") {
					a[0].kind = max(a[0].kind, 4ll);
					if(Ti % 4) Ti += (4 - Ti % 4);
					cout << Ti << '\n';
					a[0].st[a[0].k] = Ti;
					a[0].ed[a[0].k] = a[0].st[a[0].k]+3;
					Ti+=4;
				} else if(a[0].t[a[0].k] == "long") {
					a[0].kind = max(a[0].kind, 8ll);
					if(Ti % 8) Ti += (8 - Ti % 8);
					cout << Ti << '\n';
					a[0].st[a[0].k] = Ti;
					a[0].ed[a[0].k] = a[0].st[a[0].k]+7;
					Ti+=8;
				} else {
					for(ll j = 1; j <= cnt; j++) {
						if(a[j].s == a[0].t[a[0].k]) {
							a[0].kind = max(a[0].kind, a[j].kind);
							if(Ti % a[j].kind) Ti += (a[j].kind - Ti % a[j].kind);
							cout << Ti << '\n';
							a[0].st[a[0].k] = Ti;
							a[0].ed[a[0].k] = a[0].st[a[0].k]+a[j].siz-1;
							Ti+=a[j].siz;
						}
					}
				}
				break;
			}
			case 3: {
				string str;
				cin >> str;
				str += '.';
				query(str, 0, 0, 0);
				break;
			}
			case 4: {
				ll addr;
				cin >> addr;
				query2(addr, 0, "");
				break;
			}
		}
	}
}
2023/10/24 12:44
加载中...