关于莫队
查看原帖
关于莫队
823773
_sh1kong_楼主2023/5/19 19:25

RT,优化后莫队只能卡到44pts,再求优化

#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#include <climits>
#include <queue>
//#include <map>

#define endl "\n"
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
//#define int long long
#define LL long long
#define ULL unsigned long long
#define INF LLONG_MAX / 3 
#define ls(k) k << 1
#define rs(k) k << 1 | 1
#define mid(a, b) (a + b) >> 1 
#define PII pair <int, int>
#define inl inline
#define re register

const int N = 2e6 + 7, M = 2e3 + 7, P = 131, MOD = 1e9 + 7;

using namespace std;

inline int read(){
    int num = 0;
    char c;
    bool flag = false;
    while((c = getchar()) == ' ' || c == '\n' || c == '\r');
    if(c == '-') flag = true;
    else num = c - '0';
    while(isdigit(c = getchar())) num = num * 10 + c - '0';
    return (flag ? -1 : 1) * num;
} 

int t;

int n, m, len, ans;

int val[N]; 

int pos[N], cnt[N];

//query

struct query

{
	int L, R, k;
}q[N];

int put_[N];

//不带修基础莫队 

inl void init()

{
	n = read();
	int len = sqrt(n);
	for (re int i = 1; i <= n; i ++ ) val[i] = read(), pos[i] = (i - 1) / len + 1;
}

bool cmp(query x, query y)

{
	//核心
	if (pos[x.L] != pos[y.L]) return pos[x.L] < pos[y.L];
	if (pos[x.L] & 1) return x.R > y.R; 
	return x.R < y.R; 
}

inl void add(int v)

{
	cnt[val[v]] ++;
	if (cnt[val[v]] == 1) ans ++;
}

inl void del(int v)

{
	cnt[val[v]] --;
	if (cnt[val[v]] == 0) ans --;
}

inl void solve()

{
    init();

	m = read();
	for (re int i = 1; i <= m; i ++ ) q[i].L = read(), q[i].R = read(), q[i].k = i;
	sort(q + 1, q + m + 1, cmp);
	int L = 1, R = 0;
	for (re int i = 1; i <= m; i ++ )
	{
		while (L < q[i].L) del(L ++);
		while (R > q[i].R) del(R --);
		while (L > q[i].L) add(-- L);
		while (R < q[i].R) add(++ R);
		put_[q[i].k] = ans;
	}
	
	for (re int i = 1; i <= m; i ++ ) cout << put_[i] << endl;
    //puts("");
}

signed main()

{
    IOS;

    t = 1;
    //t = read();
    while (t -- ) solve();
}	

2023/5/19 19:25
加载中...