社区讨论

CSP-S T3 85pts why

题目总版参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo0uefye
此快照首次捕获于
2023/10/22 10:21
2 年前
此快照最后确认于
2023/11/02 12:02
2 年前
查看原帖
大样例是过了的
顺便 JS-S 185 可否 1=
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, op, num, maxn, sum, cur, ctot, vtot, ad;
string tp, nm;
map<string, ll> b, vid, cid;
struct C{
	string name, mname[105], tpnm[105];
	ll mtot, mtype[105], tb, sz, id[105], msz[105], mtb[105];
	map<string, ll> mid;
} c[105], t;
struct V{
	string type, name;
	ll sz, id;
} a[105];
int main(){
	cin >> n;
	b["byte"] = 1;
	b["short"] = 2;
	b["int"] = 4;
	b["long"] = 8;
	for(ll i = 1; i <= n; i++){
		cin >> op;
		if(op == 1){
			cin >> t.name >> t.mtot;
			t.tb = 0;
			t.sz = 0;
			t.mid.clear();
			for(ll j = 1; j <= t.mtot; j++){
				cin >> t.tpnm[j] >> t.mname[j];
				t.mid[t.mname[j]] = j;
				t.mtype[j] = b[t.tpnm[j]];
				t.msz[j] = b[t.tpnm[j]];
				if(t.tpnm[j] == "byte" || t.tpnm[j] == "int" || t.tpnm[j] == "short" || t.tpnm[j] == "long") t.mtb[j] = b[t.tpnm[j]];
				else t.mtb[j] = c[cid[t.tpnm[j]]].tb;
				t.tb = max(t.tb, t.mtb[j]);
				if(j == 1) t.id[j] = 0;
				else {
					ll tmp = t.id[j - 1] + t.msz[j - 1];
					if(tmp % t.mtb[j] == 0) t.id[j] = tmp;
					else t.id[j] = tmp / t.mtb[j] * t.mtb[j] + t.mtb[j];
				}
				t.sz = t.id[j] + t.msz[j];
			}
			if(t.sz % t.tb != 0) t.sz = t.sz / t.tb * t.tb + t.tb;
			cout << t.sz << " " << t.tb << endl;
			b[t.name] = t.sz;
			c[++ctot] = t;
			cid[t.name] = ctot;
		} else if(op == 2){
			cin >> a[++vtot].type >> a[vtot].name;
			vid[a[vtot].name] = vtot;
			a[vtot].sz = b[a[vtot].type];
			if(vtot == 1) a[vtot].id = 0;
			else {
				ll tmp = a[vtot - 1].id + a[vtot - 1].sz;
				ll tmptb;
				if(a[vtot].type == "byte" || a[vtot].type == "short" || a[vtot].type == "int" || a[vtot].type == "long") tmptb = b[a[vtot].type];
				else tmptb = c[cid[a[vtot].type]].tb;
				if(tmp % tmptb != 0) tmp = tmp / tmptb * tmptb + tmptb;
				a[vtot].id = tmp;
			}
			cout << a[vtot].id << endl;
		} else if(op == 3){
			ll curad = 0;
			string curnm = "", ip;
			cin >> ip;
			ip = ip + '.';
			ll l = ip.size();
			ll j;
			for(j = 0; j < l; j++){
				if(ip[j] == '.'){
					curad = a[vid[curnm]].id;
					t = c[cid[a[vid[curnm]].type]];
					curnm = "";
					break;
				} else curnm += ip[j];
			}
			j++;
			//cout << t.name << endl;
			for(; j < l; j++){
				if(ip[j] == '.'){
					//cout << j << " " << curnm << endl;
					ll iid = t.mid[curnm];
					curad = curad + t.id[iid];
					// cout << t.id[iid] << endl;
					// cout << curnm << " " << curad << " " << t.name << endl;
					t = c[cid[t.tpnm[iid]]];
					curnm = "";
				} else curnm += ip[j];
			}
			cout << curad << endl;
		} else {
			string ans = "";
			cin >> ad;
			bool flag = false, root = false, flag2 = false;
			for(ll j = 1; j <= vtot; j++){
				if(ad < a[j].sz){
					ans += a[j].name;
					root = true;
					if(a[j].type == "byte" || a[j].type == "int" || a[j].type == "short" || a[j].type == "long") flag = true;
					else t = c[cid[a[j].type]];
					break;
				} else if(j == vtot){
					break;
				} else {
					ad -= a[j + 1].id - a[j].id;
				}
			}
			if(!root){
				cout << "ERR" << endl;
				continue;
			}
			while(!flag){
				ll sum = 0;
				for(ll j = 1; j <= t.mtot; j++){
					if(ad < t.msz[j]){
						ans += "." + t.mname[j];
						if(t.tpnm[j] == "byte" || t.tpnm[j] == "int" || t.tpnm[j] == "short" || t.tpnm[j] == "long") flag = true;
						else t = c[cid[t.tpnm[j]]];
						break;
					} else {
						if(ad < t.id[j + 1] - sum || j == t.mtot){
							cout << "ERR" << endl;
							flag2 = true;
							break;
						} else {
							ad -= t.id[j + 1] - t.id[j];
							sum += t.id[j + 1] - t.id[j];
						}
					}
				}
				if(flag2) break;
			}
			if(!flag2) cout << ans << endl;
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...