求助 CE
查看原帖
求助 CE
891606
2023gdgz01楼主2024/8/22 20:48

Rt.

看不懂编译错误 38 36 C:\Users\admin\Documents\未命名1.cpp [Error] no matching function for call to 'sort(std::pair<int, int>*, std::pair<int, int>*, <unresolved overloaded function type>)'

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <utility>
#include <algorithm>

using namespace std;

template <const int _size> class block
{
	protected:
		bool flag[_size + 5];
		int n, len, End, id[_size + 5], cnt[_size + 5], box[_size + 5], diff[_size + 5], data[_size + 5], sum[(int)sqrt(_size) + 5][(int)sqrt(_size) + 5], minn[(int)sqrt(_size) + 5][(int)sqrt(_size) + 5];
		pair<int, int> t, temp[_size + 5], mode[(int)sqrt(_size) + 5][(int)sqrt(_size) + 5];
		inline bool cmp(pair<int, int> x, pair<int, int> y)
		{
			return x.second < y.second;
		}
	public:
		block() {}
		~block() {}
		inline void build(int N, int a[])
		{
			n = N;
			len = sqrt(n);
			for (register int i = 1; i <= n; ++i)
			{
				id[i] = (i - 1) / len + 1;
				temp[i] = make_pair(a[i], i);
			}
			sort(temp + 1, temp + n + 1);
			diff[0] = -1;
			for (register int i = 1; i <= n; ++i)
			{
				diff[i] = diff[i - 1] + (temp[i].first != temp[i - 1].first);
				box[diff[i]] = temp[i].first;
			}
			sort(temp + 1, temp + n + 1, cmp);
			for (register int i = 1; i <= End; ++i)
			{
				memset(cnt, 0, sizeof(cnt));
				t = make_pair(0, 0);
				for (register int j = i; j <= End; ++j)
				{
					for (register int k = (j - 1) * len + 1; k <= n && k <= j * len; ++k)
					{
						++cnt[diff[k]];
						if (cnt[diff[k]] > t.first)
						{
							t = make_pair(cnt[diff[k]], diff[k]);
						}
						else if (cnt[diff[k]] == t.first)
						{
							t = make_pair(cnt[diff[k]], min(diff[k], t.second));
						}
					}
					mode[i][j] = t;
				}
			}
			for (register int i = 1; i <= End; ++i)
			{
				for (register int j = 1; j <= n; ++j)
				{
					sum[i][diff[j]] = sum[i - 1][diff[j]];
				}
				for (register int j = (i - 1) * len + 1; j <= n && j <= i * len; ++j)
				{
					++sum[i][diff[j]];
				}
			}
			memset(cnt, 0, sizeof(cnt));
		}
		inline int query(int l, int r)
		{
			int ans = 0, t1 = 0, t2;
			int L = id[l], R = id[r];
			if (R - L < 3)
			{
				for (register int i = l; i <= r; ++i)
				{
					cnt[diff[i]] = 1;
					if (cnt[diff[i]] > cnt[ans] || cnt[diff[i]] == cnt[ans] && diff[i] < ans)
					{
						ans = diff[i];
					}
				}
			}
			else
			{
				ans = mode[L + 1][R - 1].second;
				cnt[ans] = 0;
				flag[ans] = false;
				for (register int i = l; i <= n && i <= L * len; ++i)
				{
					cnt[diff[i]] = 1;
					flag[diff[i]] = false;
				}
				for (register int i = (R - 1) * len + 1; i <= r; ++i)
				{
					cnt[diff[i]] = 1;
					flag[diff[i]] = false;
				}
				for (register int i = l, j; i <= n && i <= L * len; ++i)
				{
					if (!flag[diff[i]])
					{
						flag[diff[i]] = true;
						j = cnt[diff[i]] + sum[R - 1][diff[i]] - sum[L][diff[i]];
						if (j > t1)
						{
							t1 = j;
							t2 = diff[i];
						}
						else if (j == t1 && t2 < diff[i])
						{
							t2 = diff[i];
						}
					}
				}
				for (register int i = (R - 1) * len + 1, j; i <= r; ++i)
				{
					if (!flag[diff[i]])
					{
						flag[diff[i]] = true;
						j = cnt[diff[i]] + sum[R - 1][diff[i]] - sum[L][diff[i]];
						if (j > t1)
						{
							t1 = j;
							t2 = diff[i];
						}
						else if (j == t1 && t2 < diff[i])
						{
							t2 = diff[i];
						}
					}
				}
				if (cnt[ans] + mode[L + 1][R - 1].first < t1 || cnt[ans] + mode[L + 1][R - 1].first == t1 && t2 < ans)
				{
					ans = t2;
				}
			}
			return box[ans];
		}
};

int n, m, l, r, last, a[40005];
block<40000> b;

int main()
{
	scanf("%d%d", &n, &m);
	for (register int i = 1; i <= n; ++i)
	{
		scanf("%d", a + i);
	}
	b.build(n, a);
	while (m--)
	{
		scanf("%d%d", &l, &r);
		l = (l + last - 1) % n + 1;
		r = (r + last - 1) % n + 1;
		if (l > r)
		{
			swap(l, r);
		}
		last = b.query(l, r);
		printf("%d\n", last);
	}
	return 0;
}
2024/8/22 20:48
加载中...