首页 > 其他分享 >[CF455D] Serega and Fun 题解

[CF455D] Serega and Fun 题解

时间:2024-07-31 21:30:26浏览次数:9  
标签:Serega emd int 题解 kl 链表 lans Fun fst

不知道大家做没做过数列分块基础9题?

插入删除操作可以用链表,线段树等数据结构都不好维护,考虑分块。对于修改操作,暴力重构受影响块的链表,发现除首尾块外,其他块都可以看作是区间左移一位,所以加头删尾即可。

每个块开一个数组(绝对不能是 \((un\_)map\),不然你会和我一样死的很诡异),表示这个块这种颜色有几个,统计就是很裸的了。

时间复杂度 \(O(n\sqrt n)\)。

//分块,用unmap记录每个块的答案会死 
//块内每个数用链表记录
//时间复杂度 O(nsqrt(n)) 
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5,M=505;
int n,q,a[N],ls[N],nx[N];
int kl,num,fst[M],emd[M];
int mp[M][N];
void mk(int x){
	fst[x]=x*kl-kl+1;
	emd[x]=min(n,x*kl);
	mp[x][a[emd[x]]]++;
	for(int i=fst[x];i<min(x*kl,n);i++)
		ls[i+1]=i,nx[i]=i+1,mp[x][a[i]]++;
}void change(int l,int r){
	int fs=(l-1)/kl+1;
	int fn=l-fs*kl+kl;
	int ed=(r-1)/kl+1;
	int en=r-ed*kl+kl;
	int x=fst[fs],y=fst[ed];
	for(int i=1;i<fn;i++) x=nx[x];
	for(int i=1;i<en;i++) y=nx[y];
	if(fst[ed]==y) fst[ed]=nx[y];
	if(emd[ed]==y) emd[ed]=ls[y];
	ls[nx[y]]=ls[y];nx[ls[y]]=nx[y];
	nx[ls[x]]=y;ls[y]=ls[x];ls[x]=y;nx[y]=x;
	if(fst[fs]==x) fst[fs]=y;
	if(fs==ed) return;
	int z=emd[fs],w=fst[fs+1];
	nx[ls[z]]=0;emd[fs]=ls[z];
	nx[ls[z]]=0;ls[z]=0;
	nx[z]=w;ls[w]=z;fst[fs+1]=z;
	mp[fs][a[z]]--;mp[fs][a[y]]++;
	mp[fs+1][a[z]]++;mp[ed][a[y]]--;
	for(int i=fs+1;i<ed;i++){
		x=emd[i];y=fst[i+1];
		mp[i][a[x]]--;mp[i+1][a[x]]++;
		nx[ls[x]]=0;emd[i]=ls[x];
		nx[ls[x]]=0;ls[x]=0;
		nx[x]=y;ls[y]=x;fst[i+1]=x;
	}
}int ans(int l,int r,int c){
	int re=0;
	int fs=(l-1)/kl+1;
	int fn=l-fs*kl+kl;
	int ed=(r-1)/kl+1;
	int en=r-ed*kl+kl;
	int x=fst[fs],y=fst[ed];
	for(int i=1;i<fn;i++) x=nx[x];
	if(fs==ed){
		for(int i=fn;i<=en;i++)
			re+=(c==a[x]),x=nx[x];
		return re;
	}for(int i=fn;i<=kl;i++)
		re+=(c==a[x]),x=nx[x];
    for(int i=1;i<=en;i++)
		re+=(c==a[y]),y=nx[y];
	for(int i=fs+1;i<ed;i++) re+=mp[i][c];
	return re;
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;kl=sqrt(n);
	num=(n-1)/kl+1;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=num;i++) mk(i);
	cin>>q;int lans=0;
	while(q--){
		int o,l,r,x;
		cin>>o>>l>>r;
		l=(l+lans-1)%n+1;
		r=(r+lans-1)%n+1;
		if(l>r) swap(l,r); 
		if(o==2){
			cin>>x;
			x=(x+lans-1)%n+1;
			lans=ans(l,r,x);
			cout<<lans<<"\n";
		}else change(l,r);
	}return 0;
}

标签:Serega,emd,int,题解,kl,链表,lans,Fun,fst
From: https://www.cnblogs.com/chang-an-22-lyh/p/18335536/cf455d_serega-and-fun_tj

相关文章

  • HDU2024 R2 T9 题解
    考虑维护一下每个点的速度。把区间加拆成后缀加和后缀减,然后考虑后缀加。减就同理。考虑在一段后缀的目标速度增加之后,哪些时刻的加速度会变化。这里加速度必然只会变大\(1\),因此在这个时刻之后的速度都会增加\(1\),又由于目标速度也增加了\(1\),所以这个位置之后的加速度都不再......
  • CF455D Serega and Fun 题解
    Beforeit来当一回教练的题解翻译家,平衡树这种高级算法自然是不会的,所以详细讲一下STL。成为蒟蒻(也就是自己)的福音。Solution我们观察到题目要求“把第\(r\)个数插入在第\(l\)个数之前,其他数顺序不变“,使用\(deque\)的\(push\)_\(front\)和\(push\)_$back$操作可......
  • 暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法
    暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围也可以在电脑上游玩拉,暗区突围PC端上线在即,本次上线就是全球抢先测试了,很多小伙伴在游戏下载过程中遇到了很多问题,比如:下载失......
  • QOJ6504 Flower‘s Land 2 题解
    QOJ6504Flower'sLand2题解题目链接:QOJ6504Flower'sLand2题意:给定一个只包含\(0,1,2\)的序列,\(T\)次询问,询问有两种:区间所有数加\(1\)然后模\(3\)求一段区间能否通过每次删掉相邻两个相同的数删完(如\(1,0,0,2,2,1\)就满足条件)题解:考虑用什么方法来维护区间......
  • CF1995C Squaring 题解
    思路详解:请注意,本题解用到了非整数计算,也就是说性能可能不如整数运算,但是易于实现,追求最优解的大佬不建议观看本题解。这个题看似简单,但是由于涉及到了平方操作,不用高精度根本存不下,然后如果你要用高精度的话又会T......
  • 关于题解
    这里说一下为什么要在博客园写东西,其实有几个主要原因:首先是我一个朋友写题解的时候,因为多了一个空格被打回。然后我这个朋友就开始在这里写东西了。然后这个朋友找到了一个拿过金牌的学长,他同样之前审过题解,总之他认为只要不是题解写的完全不能看,或者在某些地方有一些事实性错......
  • 平行四边形 题解
    题目id:20306题目描述鱼大大凭借着优秀的语文成绩当上了数学课代表?!鱼大大心想着数学和我语文好也不搭边呀,不过他的数学老师疯狂给鱼大大画饼:只要你当了数学课代表,有很多很多权利的啦......最后数学老师告诉鱼大大,人只要一行行,行行行,这句话在学科上也是一样的,语文学的好,数学也一......
  • funccache:革命性的Python函数缓存工具,轻松提升代码效率!
    funccacheEnglish|中文如其名,funccache实现函数缓存功能,由GQYLPY团队研发的一个框架,可缓存某个函数或某个类中定义的所有方法的返回值。你的程序中有一个函数会被多次调用,并且返回值不变,你会怎么做?为提高代码效率,你会先调用一次该函数并把返回值存到一个变量,之后就使用......
  • Python - Functional programming
    Functionalprogrammingisaprogrammingparadigminwhichmostoftheworkinaprogramisdoneusingpurefunctions.Apurefunctionisafunctionwithoutanysideeffects;itsreturnvalueisalwaysdeterminedbyitsinputarguments,soitalwaysreturn......
  • Python - Creating jump tables using lambda functions
    Wecanplacelambdafunctioninsidelistanddictionaryliterals.Thiswaywecanuselambdaexpressionstocreatejumptables.>>>L=[lambdas:s.strip().lower(),... lambdas:s.strip().upper(),... lambdas:s.lstrip().title(),... lambd......