考试的时候本来准备混前65分,为什么在洛谷上除了前三个点其他全re?
#include <bits/stdc++.h>
using namespace std;
int n;
long long all = -1;
struct node
{
string id;
vector<string> vid;
vector<int> lei;
vector<long long> l;
vector<long long> r;
long long ssize;
int Max;
};
vector<node> v;
struct elemt
{
string id;
long long l;
long long r;
string lei;
};
vector<elemt> e;
int main()
{
freopen("struct.in","r",stdin);
freopen("struct.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i)
{
int op;
cin >> op;
if(op == 1)
{
string s;
int k;
cin >> s >> k;
node a;
a.id = s;
for (int j = 1; j <= k; ++j)
{
string s1, s2;
cin >> s1 >> s2;
if(s1 == "byte")
a.lei.push_back(1);
else if(s1 == "short")
a.lei.push_back(2);
else if(s1 == "int")
a.lei.push_back(4);
else if(s1 == "long")
a.lei.push_back(8);
a.vid.push_back(s2);
}
a.Max = -1;
a.ssize = -1;
for (int j = 0; j < k; ++j)
{
a.Max = max(a.lei[j],a.Max);
long long z = (a.ssize+1)/a.lei[j];
if((a.ssize+1)%a.lei[j] != 0)
z++;
a.l.push_back(z*a.lei[j]);
a.r.push_back(z*a.lei[j]+a.lei[j]-1);
a.ssize = z*a.lei[j]+a.lei[j]-1;
}
a.ssize++;
v.push_back(a);
cout << a.ssize << " " << a.Max << '\n';
}
else if(op == 2)
{
string s1, s2;
cin >> s1 >> s2;
elemt a;
a.id = s2;
if(s1 == "byte")
a.lei = "1";
else if(s1 == "short")
a.lei = "2";
else if(s1 == "int")
a.lei = "4";
else if(s1 == "long")
a.lei = "8";
else
a.lei = s1;
if(a.lei != s1)
{
long long z = (all+1)/(a.lei[0]-'0');
if((all+1)%(a.lei[0]-'0') != 0)
z++;
a.l = z*(a.lei[0]-'0');
a.r = z*(a.lei[0]-'0')+(a.lei[0]-'0')-1;
all = a.r;
}
else
{
int id;
for (int j = 0; j < v.size(); ++j)
if(v[j].id == s1)
{
id = j;
break;
}
long long z = (all+1)/v[id].Max;
if((all+1)%v[id].Max != 0)
z++;
a.l = z*v[id].Max;
a.r = z*v[id].Max+v[id].ssize-1;
all = a.r;
}
e.push_back(a);
cout << a.l << '\n';
}
else if(op == 3)
{
string s;
cin >> s;
int id;
if(s.find(".") == -1)
{
for (int j = 0; j < e.size(); ++j)
if(e[j].id == s)
{
id = j;
break;
}
cout << e[id].l << '\n';
}
else
{
int cd = s.find(".");
string s1 = s.substr(0,cd);
string s2 = s.substr(cd+1,s.length()-cd-1);
for (int j = 0; j < e.size(); ++j)
if(e[j].id == s1)
{
id = j;
break;
}
int id2;
for (int j = 0; j < v[id].l.size(); ++j)
if(v[id].vid[j] == s2)
{
id2 = j;
break;
}
cout << e[id].l+v[id].l[id2]-1 << '\n';
}
}
else
{
long long dr;
cin >> dr;
int id = -1;
for (int j = 0; j < e.size(); ++j)
{
if(e[j].l <= dr && e[j].r >= dr)
{
id = j;
break;
}
}
if(id == -1)
cout << "ERR" << '\n';
else if(e[id].lei == "1" || e[id].lei == "2" || e[id].lei == "4" || e[id].lei == "8")
cout << e[id].id << '\n';
else
{
int id2;
for (int j = 0; j < v.size(); ++j)
if(v[j].id == e[id].lei)
{
id2 = j;
break;
}
int id3 = -1;
for (int j = 0; j < v[id2].l.size(); ++j)
{
if(v[id2].l[j]+e[id2].l <= dr && v[id2].r[j]+e[id2].l >= dr)
{
id3 = j;
break;
}
}
if(id3 == -1)
cout << "ERR" << '\n';
else cout << e[id].id << "." << v[id2].vid[id3] << '\n';
}
}
}
return 0;
}