首页 > 其他分享 >分块莫队——维护队列

分块莫队——维护队列

时间:2024-04-23 11:44:39浏览次数:30  
标签:node rp 分块 队列 bl pos int maxn 莫队

题目描述

样例输入

2 3
1 2
Q 1 2
R 1 2
Q 1 2

样例输出

2
1

题目分析

首先它是一个离线莫队(在线超时QAQ)
离线首先存下它所有的询问和修改,分别存,询问要存下是第几次,以便后续输出,还要存下时间是第几个命令,比较询问和修改的时间,相应的变换颜色,最后整体输出

#include<bits/stdc++.h>
using namespace std;

const int maxn=133340;
const int maxm=1e6+10;
int a[maxn],n,m;
int l=1,r,col[maxm],ans,cnt[maxn],sq;
int bl[maxn];
struct node
{
	int l,r,id,t;
}q[maxn];
struct stu
{
	int pos,col,t;
}rp[maxn];

bool cmp(node A,node B)
{
	if(bl[A.l]!=bl[B.l]) return bl[A.l]<bl[B.l];
	if(bl[A.r]!=bl[B.r]) return bl[A.r]>bl[B.r];
	return A.t<B.t;
}

void add(int x)
{
	if(!col[x]) ans++;
	col[x]++;
}

void del(int x)
{
	col[x]--;
	if(!col[x]) ans--;
}

int main()
{
	scanf("%d%d",&n,&m);
	sq=pow(n,2.0/3.0);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		bl[i]=i/sq+1;
	}
	int x,y,t=0;
	int xg=0,cx=0;
	char ch;
	for(int i=1;i<=m;i++)
	{
		scanf(" %c %d%d",&ch,&x,&y);
		if(ch=='Q') cx++,q[cx]=node{x,y,cx,xg};
		else xg++,rp[xg]=stu{x,y,xg};
	}
	sort(q+1,q+1+cx,cmp);
	for(int i=1;i<=cx;i++)
	{
		while(q[i].l<l)
		{
			l--;
			add(a[l]);
		}
		while(q[i].l>l)
		{
			del(a[l]);
			l++;
		}
		while(q[i].r<r)
		{
			del(a[r]);
			r--;
		}
		while(q[i].r>r)
		{
			r++;
			add(a[r]);
		}
		while(q[i].t>t)
		{
			t++;
			if(rp[t].pos>=l&&rp[t].pos<=r)
			{
				del(a[rp[t].pos]);
				add(rp[t].col);
			}
			swap(a[rp[t].pos],rp[t].col);
		}
		while(q[i].t<t)
		{
			if(rp[t].pos>=l&&rp[t].pos<=r)
			{
				del(a[rp[t].pos]);
				add(rp[t].col);
			}
			swap(a[rp[t].pos],rp[t].col);
			t--;
		}
		cnt[q[i].id]=ans;
	}
	for(int i=1;i<=cx;i++)
	{
		printf("%d\n",cnt[i]);
	}
	
	return 0;
}

标签:node,rp,分块,队列,bl,pos,int,maxn,莫队
From: https://www.cnblogs.com/cuichenxi/p/18152520

相关文章

  • P4168 [Violet] 蒲公英 (莫队的强制在线)
    前言当个乐子看就行所用时间不如分块正解快虽然在线莫队实质也是分块[Violet]蒲公英题目背景亲爱的哥哥:你在那个城市里面过得好吗?我在家里面最近很开心呢。昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了。我......
  • 分块(板子)
    “优雅的暴力”——分块分块是一种暴力的优化,虽然效率比线段树、树状数组等数据结构低的多\((N+Q)\sqrt{N}\),但是更加灵活。分块的思想是把整个区间分成几个部分,对于要处理的区间包括两个部分“整块”,和区间边缘的“零散块”,“零散块”直接暴力,“整块”进行整体操作即可。......
  • [BZOJ4358]permu树上莫队
    先放代码晚上补(争取)#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x)++)#definefu(x,y,z)for(int(x)=(y);(x)>=(z);(x)--)typedeflonglongll;usingnamespacestd;inlineintqr(){ charch=getchar();intx=0,f=1; for(;ch<&......
  • 队列-经典应用案例
    这里来简单举几个经典的场景如"击鼓传花","字符串回文监测"等来加深对队列这个结构的直观认识.单端队列-击鼓传花这里先介绍一种队列的变种叫循环队列,即元素从队首出队后,立即又进行从队尾入队,类似行程了一个圈,与之对应的一个经典游戏就是"击鼓传花",英文叫ho......
  • FreeRTOS队列
    FreeRTOS队列在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中用全局变量来传递消息就会涉......
  • 解决了这次的消息队列堆积事故,我又解锁了新的认知与思考...
    大家好,我是程序员陶朱公。前言前两天解决了一个线上消息队列堆积事故,在这里做一个复盘与总结,希望我解决问题的方式、方法、手段对你将来遇到类似的事情有一定的帮助与启发。背景前两天,有业务方反馈,他们日常处理的工单数据变少了,希望开发同学去排查一下原因。这里简单的画下我......
  • C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞
    视频链接:C117莫队配合bitsetP4688[Ynoi2016]掉进兔子洞_哔哩哔哩_bilibili   LuoguP4688[Ynoi2016]掉进兔子洞//莫队配合bitsetO(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<bitset>usin......
  • 优先队列
    priority_queue默认大顶堆小顶堆includeincludeusingnamespacestd;voidmax_k_num(){intsource_data[10]={3,5,8,1,10,2,9,15,13,16};intk=5;//小根堆priority_queue<int,vector,greater>q;for(auton:source_data){if(q.size()==k){......
  • 题解 LGP5397【[Ynoi2018] 天降之物】/ 第四分块
    题解P5397【[Ynoi2018]天降之物】/第四分块题目描述一个长为\(n\)的序列\(a\)。你需要实现\(m\)个操作,操作有两种:把序列中所有值为\(x\)的数的值变成\(y\)。找出一个位置\(i\)满足\(a_i=x\),找出一个位置\(j\)满足\(a_j=y\),使得\(|i-j|\)最小,并输出\(|i-......
  • 莫队
    莫队介绍利用分块进行处理的离线算法;时间复杂度普遍为\(O(n\sqrt{n})\);但会被卡实现思路对答案的查询在已知区间的情况下暴力寻找的目标区间的贡献;对于已知当前\([L,R]\)区间,一共有\(4\)种情况:加上当前区间左边一格的贡献:Add(--L);先将当前的下标......