MnZn求调莫队
查看原帖
MnZn求调莫队
765954
c______楼主2024/10/2 21:01

甚至输出-ans[i]P3709P3709 过了

代码:

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define PII pair<int,int> 
//#define int ll
const int N = 2e6 + 5;


int n, T, Cnt, Bs, cnt_max = -1;
int a[N], dct[N], b[N], ans[N], cnt[N], cnt_1[N];

struct node
{
	int l, r, id;
	bool operator< (const node &e)const
	{
		return b[l] < b[e.l] || (b[l] == b[e.l] && (b[l] & 1 ? r > e.r : r < e.r));
	}
}q[N];

void init()
{
	Bs = max(1, (int)sqrt(n));
	for (int i = 1; i <= n; i ++)
		b[i] = i / Bs;
}

void add(int x)
{
	x = a[x];
	-- cnt_1[cnt[x]],++ cnt_1[++ cnt[x]], cnt_max = max(cnt_max, cnt[x]);
	//cout << cnt_max << '\n';
}

void del(int x)
{
	x = a[x];
	-- cnt_1[cnt[x]];
	if (cnt_1[cnt[x]] == 0 && cnt[x] == cnt_max)
		-- cnt_max;
	-- cnt[x];
	++ cnt_1[cnt[x]];
	//cout << cnt_max << '\n';
}

void solve()
{
	cin >> n >> T;
	init();
	for (int i = 1; i <= n; i ++)
		cin >> a[i], dct[i] = a[i];
	sort(dct + 1, dct + 1 + n);
	Cnt = unique(dct + 1, dct + 1 + n) - dct - 1;
	for (int i = 1; i <= n; i ++)
		a[i] = lower_bound(dct + 1, dct + 1 + Cnt, a[i]) - dct - 1;
	//for (int  i = 1; i <= n; i ++) cout << a[i] << " ";
	for (int i = 1; i <= n; i ++)
	{
		cin >> q[i].l >> q[i].r;
		q[i].id = i;
	}
	sort(q + 1, q + 1 + T);
	int L = 1, R = 0;
	for (int i = 1; i <= T; i ++)
	{
		while (L > q[i].l)
			add(-- L);
		while (R < q[i].r)
			add(++ R);
		while (L < q[i].l)
			del(L ++);
		while (R > q[i].r)
			del(R --);
		ans[q[i].id] = cnt_max;
	}
	for (int i = 1; i <= T; i ++)
		cout << ans[i] << '\n';	
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    solve();
}
2024/10/2 21:01
加载中...