求调 or hack
查看原帖
求调 or hack
503792
Svemit楼主2023/7/8 22:50

思路是二维数点求

l <= i <= r && l <= lst_i

的数量,不知道为什么寄了,还是说不能这样。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e6 + 5, INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n, m, q;
int a[N], pos[N], lst[N];
int c[N];
void modify(int x, int v)
{
	for(; x <= n; x += x & -x) c[x] += v;
}
int query(int x)
{
	int res = 0;
	for(; x; x -= x & -x) res += c[x];
	return res;
}
int ans[N];
vector<array<int, 5>> event; 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 	cin >> n >> m >> q;
 	for(int i = 1; i <= n; i ++) 
 	{
 		cin >> a[i], lst[i] = pos[a[i]], pos[a[i]] = i;
 		event.push_back({lst[i], 0, i});
 	}
 	for(int i = 1; i <= q; i ++)
 	{
 		int l, r;
 		cin >> l >> r;
 		event.push_back({r, 1, r, 1, i});
 		event.push_back({l - 1, 1, l - 1, 1, i});
 		event.push_back({l - 1, 1, r, -1, i});
 		event.push_back({r, 1, l - 1, -1, i});
 	}
 	sort(event.begin(), event.end());
 	for(auto evt : event)
 	{
 		if(evt[1] == 0) modify(evt[2], 1);
 		else ans[evt[4]] += evt[3] * query(evt[2]);
 	}
 	for(int i = 1; i <= q; i ++) cout << ans[i] << '\n';
    return 0;
}
2023/7/8 22:50
加载中...