mxqz 莫队卡常
查看原帖
mxqz 莫队卡常
675466
zzx0102楼主2023/11/2 22:06
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define DISABLE_MMAP
#define W while
#define gc getchar
#define pc putchar
#define I inline
const int N = 500010; int n, m, v[N], in[N], cnt[N], G[N], g[N], blo, ans[N];
int len, l = 1, r, now; bool vis[N]; int L[N], R[N];
const int SIZE=(1<<20)+1;
char buf[SIZE],*p1=buf,*p2=buf;
char buffer[SIZE];
int op1=-1;
const int op2=SIZE-1;
inline char readchar() {
	if(p1!=p2) {
		return *p1++;
	}
	return p1==(p2=(p1=buf)+fread(buf,1,SIZE-1,stdin))?EOF:*p1++;
}
inline void flush() {
	fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
	if(op1==op2) flush();
	buffer[++op1]=x;
}
#ifndef ONLINE_JUDGE
#define readchar getchar
#endif
#define putchar writechar
inline int read() {
	char c=readchar(); int x=0;
	while(c<=32) {
		c=readchar();
	}
	for(; ('0'<=c && c<='9'); c=readchar()) {
		x=x*10+c-'0';
	}
	return x;
}
inline void write(int x) {
	char s[25];
	int n=0;
	while(x || !n) {
		s[n++]='0'+x%10,x/=10;
	}
	while(n--) {
		writechar(s[n]);
	}
}
struct Q {
	int l, r, id;
	friend bool operator < (const Q &a, const Q &b) {
		return (in[a.l] != in[b.l]) ? (in[a.l] < in[b.l]) : ((in[a.l] & 1) ? a.r < b.r : a.r > b.r);
	}
} q[N];
I void add(int x) {
	cnt[x]++;
	if(cnt[x] == 1) g[x]++, G[in[x]]++;
	if(cnt[x] == 2) g[x]--, G[in[x]]--;
}
I void del(int x) {
	cnt[x]--;
	if(cnt[x] == 1) g[x]++, G[in[x]]++;
	if(cnt[x] == 0) g[x]--, G[in[x]]--;
}
I int query() {
	for(int i = 1; i <= blo; i++) if(G[i]) {
		for(int j = L[i]; j <= R[i]; j++) if(g[j]) return j;
	}
	return 0;
}
int main() {
	n = read(); for(int i = 1; i <= n; i++) v[i] = read(); int len = 700;
	for(int i = 1; i <= 500000; i++) in[i] = (i + len - 1) / len; blo = in[500000];
	for(int i = 1; i <= blo; i++) L[i] = (i - 1) * len + 1, R[i] = min(i * len, n);
	m = read(); for(int i = 1; i <= m; i++) {q[i].l = read(), q[i].r = read(); q[i].id = i;}
	sort(q + 1, q + 1 + m);
	for(int i = 1; i <= m; i++) {
		W(l > q[i].l) add(v[--l]);
		W(r < q[i].r) add(v[++r]);
		W(l < q[i].l) del(v[l++]);
		W(r > q[i].r) del(v[r--]);
		ans[q[i].id] = query();
	}
	for(int i = 1; i <= m; i++) write(ans[i]), writechar('\n');
	flush();
	return 0;
}

有没有什么比较省力的卡过去的技巧

2023/11/2 22:06
加载中...