求调(WA)
查看原帖
求调(WA)
555065
ChrysanthBlossom楼主2024/4/5 14:13

先不管踢的,先看看怎么在#5#6#9挖的吧(

都是在比较后面挖的,本地 80 以内完全拍不出来。

#include<bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
const int maxn=1e5+7;
int n,m;
int block_siz,num_siz;
int sum[500][maxn];
int sum_block[500][500];
int a[maxn];
int rt[500][maxn];// 位置为真位置
int f[500][500];// 位置为块内位置
int siz[500][500];
inline int find(int blk,int k){
	if(f[blk][k]==k)return k;
	f[blk][k]=find(blk,f[blk][k]);
	return f[blk][k];
}
int bl[maxn],br[maxn];
int belong[maxn];
int belong_num[maxn];
int bln[maxn],brn[maxn];
inline void merge(int blk,int a,int b){
	a=find(blk,a);
	b=find(blk,b);
	if(a==b)return;
	f[blk][a]=b;
	siz[blk][b]+=siz[blk][a];
}
void small_chg(int l,int r,int x,int y){
	if(belong[l]!=belong[r]){
		cout<<"寄\n";
		exit(0);
	}
	for(ri i=bl[belong[l]];i<=br[belong[r]];i++){
		a[i]=a[find(belong[l],i-bl[belong[l]]+1)+bl[belong[l]]-1];
	}
	rt[belong[l]][x]=rt[belong[l]][y]=0;
	for(ri i=bl[belong[l]];i<=br[belong[r]];i++){
		if(a[i]!=x&&a[i]!=y)continue;
		f[belong[l]][i-bl[belong[l]]+1]=i-bl[belong[l]]+1;
		siz[belong[l]][i-bl[belong[l]]+1]=1;
	}
	int cnt=0;
	for(ri i=bl[belong[l]];i<=br[belong[r]];i++){
		if(a[i]==x&&l<=i&&i<=r){
			cnt++;
			a[i]=y;
		}
		if(a[i]==x){
			if(!rt[belong[i]][x]){
				rt[belong[i]][x]=i;
			}
			else{
				merge(belong[i],i-bl[belong[i]]+1,rt[belong[i]][x]-bl[belong[i]]+1);
			}
		}
		if(a[i]==y){
			if(!rt[belong[i]][y]){
				rt[belong[i]][y]=i;
			}
			else{
				merge(belong[i],i-bl[belong[i]]+1,rt[belong[i]][y]-bl[belong[i]]+1);
			}
		}
	}
	for(ri i=belong[l];br[i];i++){
		sum[i][x]-=cnt;
		sum[i][y]+=cnt;
		sum_block[i][belong_num[x]]-=cnt;
		sum_block[i][belong_num[y]]+=cnt;
	}
}
inline int change_block(int blk,int x,int y){
	if(!rt[blk][x])return 0;
	if(!rt[blk][y]){
		rt[blk][y]=rt[blk][x];
		a[find(blk,rt[blk][x]-bl[blk]+1)+bl[blk]-1]=y;
		rt[blk][x]=0;
		return siz[blk][rt[blk][y]-bl[blk]+1];
	}
	int res=siz[blk][find(blk,rt[blk][x]-bl[blk]+1)];
	a[find(blk,rt[blk][x]-bl[blk]+1)+bl[blk]-1]=y;
	merge(blk,rt[blk][x]-bl[blk]+1,rt[blk][y]-bl[blk]+1);
	rt[blk][x]=0;
	return res;
}
void change(int l,int r,int x,int y){
	if(belong[l]==belong[r]){
		small_chg(l,r,x,y);
		return;
	}
	small_chg(l,br[belong[l]],x,y);
	int res=0;
	for(ri i=belong[l]+1;i<=belong[r]-1;i++){
		res+=change_block(i,x,y);
		sum[i][x]-=res;
		sum[i][y]+=res;
		sum_block[i][belong_num[x]]-=res;
		sum_block[i][belong_num[y]]+=res;
	}
	for(ri i=belong[r];br[i];i++){
		sum[i][x]-=res;
		sum[i][y]+=res;
		sum_block[i][belong_num[x]]-=res;
		sum_block[i][belong_num[y]]+=res;
	}
	small_chg(bl[belong[r]],r,x,y);
}
int tong[maxn];
int tong_block[500];
inline int query_small(int l,int r,int k){
	for(ri i=l;i<=r;i++){
		a[i]=a[find(belong[i],i-bl[belong[i]]+1)+bl[belong[i]]-1];
	}
	for(ri i=l;i<=r;i++){
		tong[a[i]]++;
		tong_block[belong_num[a[i]]]++;
	}
	int lst=0;
	int now_pos=1;
	while(lst+tong_block[now_pos]<k){
		lst+=tong_block[now_pos];
		now_pos++;
	}
	now_pos=bln[now_pos];
	while(lst+tong[now_pos]<k){
		lst+=tong[now_pos];
		now_pos++;
	}
	for(ri i=l;i<=r;i++){
		tong[a[i]]--;
		tong_block[belong_num[a[i]]]--;
	}
	return now_pos;
}
int maxi_num;
inline int query(int l,int r,int k){
	if(belong[l]==belong[r]){
		return query_small(l,r,k);
	}
	for(ri i=l;i<=br[belong[l]];i++){
		a[i]=a[find(belong[i],i-bl[belong[i]]+1)+bl[belong[i]]-1];
		tong[a[i]]++;
		tong_block[belong_num[a[i]]]++;
	}
	for(ri i=bl[belong[r]];i<=r;i++){
		a[i]=a[find(belong[i],i-bl[belong[i]]+1)+bl[belong[i]]-1];
		tong[a[i]]++;
		tong_block[belong_num[a[i]]]++;
	}
	int now_pos=1;
	int lst=0;
	while(lst+tong_block[now_pos]+sum_block[belong[r]-1][now_pos]-sum_block[belong[l]][now_pos]<k){
		lst+=tong_block[now_pos]+sum_block[belong[r]-1][now_pos]-sum_block[belong[l]][now_pos];
		now_pos++;
	}
	now_pos=bln[now_pos];
	while(lst+tong[now_pos]+sum[belong[r]-1][now_pos]-sum[belong[l]][now_pos]<k){
		lst+=tong[now_pos]+sum[belong[r]-1][now_pos]-sum[belong[l]][now_pos];
		now_pos++;
		assert(now_pos<=maxi_num);
	}
	for(ri i=l;i<=br[belong[l]];i++){
		tong[a[i]]--;
		tong_block[belong_num[a[i]]]--;
	}
	for(ri i=bl[belong[r]];i<=r;i++){
		tong[a[i]]--;
		tong_block[belong_num[a[i]]]--;
	}
	return now_pos;
}
void init(){
	block_siz=500;
	for(ri i=1;i<=n;i++){
		belong[i]=belong[max(0,i-block_siz)]+1;
	}
	memset(bl,0x3f,sizeof(bl));
	for(ri i=1;i<=n;i++){
		bl[belong[i]]=min(bl[belong[i]],i);
		br[belong[i]]=max(br[belong[i]],i);
	}
	num_siz=500;
	for(ri i=1;i<=maxi_num;i++){
		belong_num[i]=belong_num[max(0,i-num_siz)]+1;
	}
	memset(bln,0x3f,sizeof(bln));
	for(ri i=1;i<=maxi_num;i++){
		bln[belong_num[i]]=min(bln[belong_num[i]],i);
		brn[belong_num[i]]=max(brn[belong_num[i]],i);
	}
}
inline void build_block(int blk){
	for(ri i=bl[blk];i<=br[blk];i++){
		f[blk][i-bl[blk]+1]=i-bl[blk]+1;
		siz[blk][i-bl[blk]+1]=1;
	}
	for(ri i=bl[blk];i<=br[blk];i++){
		if(!rt[blk][a[i]]){
			rt[blk][a[i]]=i;
		}
		else{
			merge(blk,i-bl[blk]+1,rt[blk][a[i]]-bl[blk]+1);
		}
	}
	for(ri i=1;i<=br[blk];i++){
		sum[blk][a[i]]++;
		sum_block[blk][belong_num[a[i]]]++;
	}
}
inline int read(){
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
inline void write(ll x){
	if(x/10)write(x/10);
	putchar(x%10+'0');
}
signed main(){
	n=read();m=read();
	for(ri i=1;i<=n;i++){
		a[i]=read();
	}
	maxi_num=1e5;
	init();
	for(ri i=1;br[i];i++){
		build_block(i);
	}
	for(ri i=1;i<=m;i++){
		int op,l,r,k,x,y;
		op=read();
		l=read();
		r=read();
		if(op==1){
			x=read();
			y=read();
			change(l,r,x,y);
		}
		else{
			k=read();
			write(query(l,r,k));
			putchar('\n');
		}
	}
	return 0;
}
2024/4/5 14:13
加载中...