四个TLE
查看原帖
四个TLE
369399
yizhiming楼主2022/7/25 21:23

直接写的带修莫队,记录答案用的map代码如下,而且当我ch只是一个char变量而不是数组时,读入ch改成scanf和getchar都会导致全WA也不知道为啥

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
int read(){
	int x=0,f=1;char ch = getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch = getchar();}
	while(ch>='0'&&ch<='9'){x = x*10+ch-'0';ch = getchar();}
	return x*f;
}
const int N = 1e5+5;
struct aaa{
	int l,r,t,rk1,rk2,id,k;
	bool operator<(const aaa &x)const{
		if(rk1==x.rk1){
			if(rk2==x.rk2){
				return t<x.t;
			}else{
				return rk2<x.rk2;
			}
		}else{
			return rk1<x.rk1;
		}
	}
}node[N];
int a[N];
int pla[N],book[N];
map<int,int>cnt;
int ans[N];
int main(){
	int n,m;
	n = read();m = read();
//	int siz = sqrt(n);
	int siz = pow(n,0.6666667);
	for(int i=1;i<=n;i++){
		a[i] = read();
	}
	char ch[5];
	int tot=0,x=0;
	for(int i=1;i<=m;i++){
//		ch=getchar();
//		cin>>ch;
		scanf("%s",&ch);
		if(ch[0]=='Q'){
			tot++;
			node[tot].l = read();node[tot].r = read();node[tot].k = read();node[tot].t = x;
			node[tot].id = tot;node[tot].rk1 = (node[tot].l-1)/siz+1;node[tot].rk2 = (node[tot].r-1)/siz+1;
		}else{
			x++;
			pla[x]=read();book[x]=read();
		}
	}
	sort(node+1,node+1+tot);
	int lx=1,rx=0,tx=0;
	for(int i=1;i<=tot;i++){
		while(lx>node[i].l){
			lx--;
			cnt[a[lx]]++;
		}
		while(rx<node[i].r){
			rx++;
			cnt[a[rx]]++;
		}
		while(lx<node[i].l){
			cnt[a[lx]]--;
			lx++;
		}
		while(rx>node[i].r){
			cnt[a[rx]]--;
			rx--;
		}
		while(tx<node[i].t){
			tx++;
			if(pla[tx]>=node[i].l&&pla[tx]<=node[i].r){
				cnt[book[tx]]++;
				cnt[a[pla[tx]]]--;
			}
			swap(a[pla[tx]],book[tx]);
		}
		while(tx>node[i].t){
			if(pla[tx]>=node[i].l&&pla[tx]<=node[i].r){
				cnt[book[tx]]++;
				cnt[a[pla[tx]]]--;
			}
			swap(a[pla[tx]],book[tx]);
			tx--;
		}
		ans[node[i].id] = cnt[node[i].k];
	}
	for(int i=1;i<=tot;i++){
		cout<<ans[i]<<"\n";
	}
	return 0;
}
2022/7/25 21:23
加载中...