求助,TLE #7~#10,被卡11.4514h了
查看原帖
求助,TLE #7~#10,被卡11.4514h了
510555
ImposterAnYu楼主2024/3/31 09:57
#include<bits/stdc++.h>
#define int1 long long
#define N 200000
#define M 1000000
#define inf 1145141919
using namespace std;
int1 n,q,qq,cc,k,i,j,c[M + 5],a[N + 5],b[N + 5],id[N + 5],p[N + 5],l,r,s,sqn,l1,r1,now;
char ch;
struct owo{
	int1 l,r,id,ans,pre;//pre表示进行该次查询时前面进行了几次修改。 
} m[N + 5];
bool cmp(owo x,owo y){
	if(b[x.l] != b[y.l]){
		return x.l < y.l;
	}
	if(b[x.l] & 1){
		return x.r < y.r;
	}
	return x.r > y.r;
}
int1 read(){
	int1 x = 0,f = 1;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-'){
			f = -1;
		}
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
void u_print(int1 x){
	if(x > 9){
    	u_print(x / 10);
  	}
  	putchar(x % 10 ^ 48);
  	return ;
}
void print(int1 x){
	if(x < 0){
    	putchar('-');
    	x = -x;
	}
	u_print(x);
	return ;
}
void ps(int1 x){
	print(x);
	putchar(' ');
	return ;
}
void pe(int1 x){
	print(x);
	putchar('\n');
	return ;
}
void f(int1 i,int1 l,int1 r,int1 id,int1 ans,int1 pre){//结构体读入(?) 
	m[i].l = l,m[i].r = r,m[i].id = id,m[i].ans = ans,m[i].pre = pre;
	return ;
}
int main(){
	n = read(),q = read();
	for(i = 1; i <= n; i++){
		a[i] = read();
	}
	for(i = 1; i <= q; i++){
		ch = getchar();
		while(ch < 'A' || ch > 'Z'){
			ch = getchar();
		}
		l1 = read(),r1 = read();
		if(ch == 'Q'){
			++qq;
			f(qq,l1,r1,qq,0,cc);//读入询问。 
		}else{
			id[++cc] = l1,p[cc] = r1;//读入修改。 
		}
	}
	sqn = n / (int1)(sqrt(qq));//块长。 
	for(i = 1; i <= n; i++){
		b[i] = (i - 1) / sqn + 1;
	}
	sort(m + 1,m + qq + 1,cmp);//迷惑排序。 
	s = r = 0,l = 1,now = 0;//now表示现在修改了几次。 
	for(i = 1; i <= qq; i++){
		while(l < m[i].l){//莫队模板。 
			if(c[a[l]] == 1){
				s--;
			}
			c[a[l]]--,l++;
		}
		while(l > m[i].l){
			l--,c[a[l]]++;
			if(c[a[l]] == 1){
				s++;
			}
		}
		while(r < m[i].r){
			r++,c[a[r]]++;
			if(c[a[r]] == 1){
				s++;
			}
		}
		while(r > m[i].r){
			if(c[a[r]] == 1){
				s--;
			}
			c[a[r]]--,r--;
		}
		while(now > m[i].pre){//多修改了就改回去。 
			if(id[now] <= m[i].r && id[now] >= m[i].l){
				if(c[a[id[now]]] == 1){
					s--;
				}
				c[a[id[now]]]--,c[p[now]]++;
				if(c[p[now]] == 1){
					s++;
				}
			}
			swap(a[id[now]],p[now]);
			now--;
		}
		while(now < m[i].pre){//少修改了就去修改。 
			now++;
			if(id[now] <= m[i].r && id[now] >= m[i].l){
				if(c[a[id[now]]] == 1){
					s--;
				}
				c[a[id[now]]]--,c[p[now]]++;
				if(c[p[now]] == 1){
					s++;
				}
			}
			swap(a[id[now]],p[now]);
		}
		m[m[i].id].ans += s;
	}
	for(i = 1; i <= qq; i++){//输出。 
		pe(m[i].ans);
	}
	return 0;
}

记录

2024/3/31 09:57
加载中...