首页 > 其他分享 >Codeforces 1588F - Jumping Through the Array

Codeforces 1588F - Jumping Through the Array

时间:2023-06-06 18:44:46浏览次数:39  
标签:cur int 询问 1588F Jumping MAXN vec Array 关键点

显然无法用 polylog 的数据结构维护,序列分块也不行,考虑询问分块。每 \(B\) 个询问处理一次。

将这个询问中 \(2,3\) 操作涉及到的点设为“关键点”,那么容易发现,环上每一段以关键点结尾的链在这块操作的过程中始终保持不变,也就是说我们可以把它们缩在一起。

先预处理出每个块的增量对每组询问的答案的贡献系数,这可以一遍 two pointers 求出,随后询问就可以通过实时维护一个增量数组求出。\(2\) 操作就直接对环上的每个段令其增量数组 \(+v\) 即可,由于关键点个数是 \(O(B)\) 的所以修改的位置也是 \(O(B)\) 的。\(3\) 操作直接换。取 \(B=\sqrt{q}\) 即可。总复杂度 \(O(q\sqrt{q})\)。

const int MAXN=2e5;
const int BLK=500;
int n,qu,p[MAXN+5];ll a[MAXN+5],s[MAXN+5];
struct qry{int opt,x,y;}q[MAXN+5];
struct dat{
	int x,coef,id;
	friend bool operator <(const dat &X,const dat &Y){
		return X.x<Y.x;
	}
}d[BLK*2+5];
bool vis[MAXN+5];
int nxt[MAXN+5],id[MAXN+5],coef[BLK+5][BLK*2+5],len,tmp[BLK*2+5],dcnt;
ll add[BLK*2+5];
void deal(int l,int r){
//	printf("deal %d %d\n",l,r);
	memset(vis,0,sizeof(vis));memset(nxt,0,sizeof(nxt));
	memset(id,0,sizeof(id));memset(coef,0,sizeof(coef));len=dcnt=0;
	memset(tmp,0,sizeof(tmp));memset(add,0,sizeof(add));
	for(int i=l;i<=r;i++){
		if(q[i].opt==1)d[++dcnt]={q[i].x-1,-1,i-l},d[++dcnt]={q[i].y,1,i-l};
		else if(q[i].opt==2)vis[q[i].x]=1;
		else vis[q[i].x]=vis[q[i].y]=1;
	}
	for(int i=1;i<=n;i++)if(vis[i]){
		int cur=p[i];vector<int>vec;
		while(!vis[cur])vec.pb(cur),cur=p[cur];
		vec.pb(cur);id[cur]=++len;
		for(int x:vec)nxt[x]=cur;
	}
//	for(int i=1;i<=n;i++)printf("%d%c",nxt[i]," \n"[i==n]);
//	for(int i=1;i<=n;i++)printf("%d%c",id[i]," \n"[i==n]);
	sort(d+1,d+dcnt+1);
	for(int i=1,j=1;i<=dcnt;i++){
		while(j<=d[i].x){tmp[id[nxt[j]]]++;++j;}
		for(int k=1;k<=len;k++)coef[d[i].id][k]+=d[i].coef*tmp[k];
	}
	for(int i=l;i<=r;i++){
		if(q[i].opt==1){
			ll res=s[q[i].y]-s[q[i].x-1];
			for(int k=1;k<=len;k++)res+=add[k]*coef[i-l][k];
			printf("%lld\n",res);
		}else if(q[i].opt==2){
			int cur=p[q[i].x];
			do{
				add[id[nxt[cur]]]+=q[i].y;cur=p[nxt[cur]];
			}while(cur!=p[q[i].x]);
		}else swap(p[q[i].x],p[q[i].y]);
	}
	for(int i=1;i<=n;i++)a[i]+=add[id[nxt[i]]],s[i]=s[i-1]+a[i];
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];
	for(int i=1;i<=n;i++)scanf("%d",&p[i]);
	scanf("%d",&qu);int blk_sz=(int)sqrt(qu),cur=0;
	for(int i=1;i<=qu;i++)scanf("%d%d%d",&q[i].opt,&q[i].x,&q[i].y);
	for(int i=1;i<=qu;i++){
		++cur;
		if(cur==blk_sz)deal(i-cur+1,i),cur=0;
	}
	if(cur)deal(qu-cur+1,qu);
	return 0;
}

标签:cur,int,询问,1588F,Jumping,MAXN,vec,Array,关键点
From: https://www.cnblogs.com/tzcwk/p/Codeforces-1588F.html

相关文章

  • 关于TChunkedArray和UE5的ECS框架Mass
    在虚幻引擎中,TChunkArray是一个动态数组类型。它通过分配一系列固定大小的Chunk来管理Array中的元素。每个Chunk具有以下特征:1.固定大小,通常为4096个元素。该大小在TChunkArray定义时指定,之后所有Chunk的大小都是一致的。2.可以连续或不连续的分配在内存中。TChunk......
  • “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学
    1.“AIEarth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray使用教学,针对气象领域.nc文件读取处理比赛官网:https://tianchi.aliyun.com/specials/promotion/aiearth2021?spm=a2c22.12281976.0.0.4d0d19efK2FngK1.1背景描述聚焦全球大气海......
  • Interesting Array 题解
    InterestingArray题目大意构造一个序列\(a\),使其满足若干限制条件,每个限制条件是形如lrq的式子,其意义是:\(\&_{i=l}^ra_i=q\)。题意分析看上去是构造题,实际上是数据结构题。我们不妨先令初始时\(a\)为一个全\(0\)序列,再逐一看每个限制条件。为了满足某一个限制条件......
  • [LeetCode] 2460. Apply Operations to an Array
    Youaregivena 0-indexed array nums ofsize n consistingof non-negative integers.Youneedtoapply n-1 operationstothisarraywhere,inthe ith operation(0-indexed),youwillapplythefollowingonthe ith elementof nums:If nums[i]......
  • Programming: elimination array duplicate
     JavaScript1.spliceletarr=[1,2,3,5,6,4,3,2,1,1,2,3,4,5]for(leti=0;i<arr.length-1;++i){for(letj=i+1;j<arr.length;++j){if(arr[i]===arr[j]){arr.splice(j--,1)}}}c......
  • 2023年6月2日,ArrayList
    1.ArrayListpackagecom.wz.arraylist_class;importjava.util.*;publicclasstest02{/***知识点:集合中可以存储不同类型的元素*泛型*@paramargs**/publicstaticvoidmain(String[]args){ArrayList<String>list......
  • 0002-array笔记
    目录std::array的size()是编译期确定的,不可改变大小std::span和std::array区别展开查看`span`是一个轻量级的容器,可以包装任意类型和大小的连续内存区域,它并不拥有所包装的内存,只是提供了对这些内存的非拥有式视图`span`的作用是提供对一段内存的访问,而不是管理一......
  • List系列集合:ArrayList集合的底层原理
        ......
  • Arrays:自定义排序规则的方式二
          ......
  • Arrays类:自定义排序规则的方式一
         ......