社区讨论
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 条回复,欢迎继续交流。
正在加载回复...