cspsT3 15pt求调
  • 板块学术版
  • 楼主liuyiche
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 08:53
  • 上次更新2023/11/2 12:01:57
查看原帖
cspsT3 15pt求调
767728
liuyiche楼主2023/10/22 08:53

考试的时候本来准备混前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;
} 
2023/10/22 08:53
加载中...