写分块为什么re了?
  • 板块P3939 数颜色
  • 楼主Miraii
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/10/8 10:15
  • 上次更新2023/11/4 04:22:12
查看原帖
写分块为什么re了?
311942
Miraii楼主2021/10/8 10:15
#include <bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;
const int N=4e5+10;
int pos[N],pl[N],pr[N],t;
int n,m,q,a[N];
vector<int> v[1000];
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}
void upd(int l,int r){
    int L=pos[l],R=pos[r];
    v[L][a[l]]--;
    v[L][a[r]]++;
    v[R][a[r]]--;
    v[R][a[l]]++;
    swap(a[l],a[r]);
}
int query(int l,int r,int c){
    int L=pos[l],R=pos[r],res=0;
    if(L==R){
	for(int i=l;i<=r;i++){
	    if(a[i]==c) res++;
	}
	return res;
    }
    for(int i=l;i<=pr[L];i++)
	if(a[i]==c) res++;
    for(int i=pl[R];i<=r;i++)
	if(a[i]==c) res++;
    for(int i=L+1;i<R;i++)
	res+=v[i][c];
    return res;
}
int main(){
    n=read();m=read();
    t=sqrt(n);
    for(int i=1;i<=n;i++){
	a[i]=read();
	pos[i]=(i-1)/t+1;
	v[pos[i]].push_back(a[i]);
    }
    for(int i=1;i<=pos[n];i++){
	pl[i]=pr[i-1]+1,pr[i]=min(n,pl[i]+t-1);
    }
    for(int i=1;i<=m;i++){
	int c=read();
	if(c==1){
	    int l=read(),r=read(),k=read();
	    printf("%d\n",query(l,r,k));
	}
	else{
	    int x=read();
	    upd(x,x+1);
	}
    }
    return 0;
}

2021/10/8 10:15
加载中...