过样例并且过了手搓样例求调
查看原帖
过样例并且过了手搓样例求调
573963
wbh20090611楼主2024/10/20 15:33
#include <bits/stdc++.h>
#define int long long
#define mid ((l + r) >> 1)
using namespace std;
const long long N = 300005;
int n, m, q, x, y, l, r;
vector <int> f[N];
vector <int> t[N];
vector <int> le;
void del(vector <int> &vec, int b)
{
	vec.erase(vec.begin() + b);
	return;
}
void add(vector <int> &vec, int b, int c)
{
	vec.insert(vec.begin() + c, b);
}
signed main()
{
	cin >> n >> m >> q;
	for (int i = n; i <= n * m; i += n)
		le.push_back(i);
	while(q--)
	{
		scanf("%lld%lld", &x, &y);
		if (y == m)
		{
			printf("%lld\n", le[x - 1]);
			le.push_back(le[x - 1]);
			del(le, x - 1);
		}
		else if (f[x].size() + y < m)
		{
			if (t[x].size() == 0)
			{
				printf("%lld\n", (x - 1) * m + y);
				add(t[x], (x - 1) * m + y, upper_bound(t[x].begin(), t[x].end(), (x - 1) * m + y) - t[x].begin());
				f[x].push_back(le[x - 1]);
				del(le, x - 1);
				le.push_back((x - 1) * m + y);
			}
			else
			{
				l = y;
				r = m - 1 - f[x].size();
				while(l < r)
				{
					if (upper_bound(t[x].begin(), t[x].end(), (x - 1) * m + l) - t[x].begin() - 1 >= y)
						r = mid;
					else
						l = mid + 1;
				}
				printf("%lld\n", (x - 1) * m + l);
				add(t[x], (x - 1) * m + l, upper_bound(t[x].begin(), t[x].end(), (x - 1) * m + l) - t[x].begin());
				f[x].push_back(le[x - 1]);
				del(le, x - 1);
				le.push_back((x - 1) * m + l);
			}
		}
		else
		{
			printf("%lld\n", f[x][y - (m - f[x].size() - 1) - 1]);
			del(f[x], y - (m - f[x].size() - 1) - 1);
			f[x].push_back(le[x - 1]);
			del(le, x - 1);
			le.push_back((x - 1) * m + y);
		}
	}
}

2024/10/20 15:33
加载中...