首页 > 其他分享 >带修莫队例题详解

带修莫队例题详解

时间:2022-08-24 01:04:43浏览次数:84  
标签:dui int ir read tm cntq 例题 详解 修莫队

带修莫队

[P1903 国家集训队] 数颜色 / 维护队列

版本更新内容:

  • 在普通莫队基础上增加时间坐标,提高游戏难度;
  • 排序时以时间坐标为第三关键字,奇偶排序玄学值上调 \(20\%\);
  • 代码常数加大,请玩家将分块大小调至 \(n^{\frac{2}{3}}\) 以抵消常数因子;
  • 莫队函数主体内容增加:双指针操作完,请将时间轴调至正确位置,并关注区间内时间扰动;
  • 在时间跳跃时,若目标是未来,请先抵达未来再处理时间扰动,若目标是过去,请先处理时间扰动再回到过去。\(swap\) 是个神奇且玄妙的操作,请学会使用;详见代码中 \(upd()\) 函数的注释;
  • 请分别储存时间节点询问节点,提问者会感谢你;
  • 请勿忘记 \(I/O\) 优化 , 祝您游戏愉快。
#include<bits/stdc++.h>
#define re register
#define rep(i,a,n) for(re int i=a;i<=n;++i)
using namespace std;
inline int read() {
    re int x=0,f=1;re char c=getchar();//getchar()yyds!
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
const int maxn = 1e6;
struct area{int l,r,id,tm;}dui[maxn]; 
int a[maxn],ans,n,m,bel[maxn],ens[maxn];
int cntr,cntq;
int cnt[maxn];
bool cmp(area x,area y) {
	if(bel[x.l]==bel[y.l]) {
		if(bel[x.r]==bel[y.r]) return x.tm < y.tm;
		return x.r < y.r;
	}
	return x.l < y.l;
}
bool cmp1(area x,area y)
{
	if(bel[x.l] != bel[y.l]) return x.l<y.l;
	if(bel[x.r] != bel[y.r]) if(bel[x.l]^1) return x.r < y.r;
	return x.tm > y.tm; 
} 
struct Memory {int pos,val;}mem[maxn];
void upd(int l,int r,int tm)
{
	re int pos = mem[tm].pos ,val = mem[tm].val;
	if(pos >= l && pos <= r)
	{
		ans -= !(--cnt[a[pos]]);
		ans += !(cnt[val]); cnt[val]++;
	}
	swap(a[pos],mem[tm].val); 
	//这里有个很巧妙的操作
    //对于一个操作,下一次需要为的颜色是本次被改变的颜色
    //比如,我把颜色3改为了7,那么再进行这次修改的时候就是把7改为3
    //所以直接交换两种颜色就好 
    // 假如经过两次,则swap操作就奇妙地把原数组还原了 
}
void solv() {
	ans=0;
	re int il=1,ir=0,nt=0;
	rep(i,1,cntq)
	{
		int l=dui[i].l,r=dui[i].r,tm=dui[i].tm;
		while(il < l){--cnt[a[il]];ans -= !(cnt[a[il]]);++il;}
		while(il > l){il--; ans += !cnt[a[il]]; ++cnt[a[il]]; } 
		while(ir < r){++ir; ans += !cnt[a[ir]]; ++cnt[a[ir]];}
		while(ir > r){--cnt[a[ir]]; ans -= !cnt[a[ir]]; --ir;}
		while(nt > tm){upd(il,ir,nt);--nt;} // 先更新再回溯
		while(nt < tm){++nt;upd(il,ir,nt);} // 先回溯再更新,原因是upd里的 swap 
		ens[dui[i].id] = ans;
	}	
}
int main()
{
	n=read(),m=read();
	int blk = (int)pow(n,(double)2*1.0/(double)3); // 2/3次方块长优化
	//int blk = (int)sqrt(n); // 根号已落后于版本
	rep(i,1,n) a[i] = read(),bel[i]=(i-1)/blk;
	char ch;
	int l,r,p,co;
	rep(i,1,m) {
		scanf("%c",&ch);
		if(ch == 'R')
		{
			++cntr; p=read(),co=read();
			mem[cntr].pos = p, mem[cntr].val = co;
		}
		else
		{
			dui[++cntq].l=read(),dui[cntq].r=read();
			dui[cntq].id = cntq;
			dui[cntq].tm = cntr;
		}
	}
    sort(dui+1,dui+cntq+1,cmp);
    solv();
    rep(i,1,cntq) printf("%d\n",ens[i]);
	return 0;
} 

作者:@魔幻世界魔幻人生
本文为作者原创,转载请注明出处:https://www.cnblogs.com/subtlemaple/p/16618356.html

标签:dui,int,ir,read,tm,cntq,例题,详解,修莫队
From: https://www.cnblogs.com/subtlemaple/p/16618387.html

相关文章

  • TCP协议详解
    目录TCP协议报头三次握手四次挥手在网络基础里面有提到TCP协议是一种面向连接的可靠的传输协议,那么本文主要介绍TCP协议是如何实现连接及可靠性传输的。TCP协议报头......
  • JavaScript之Object.assign()方法详解
    Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。语法:Object.assign(target,...sources)target:目标对象。sourc......
  • Java方法详解
    Java方法是语句的集合,它们在一起执行一个功能publicstaticvoidmain(String[]args){  intx=max(30,30);//调用max方法  System.out.println(x);}publ......
  • java集合详解
    目录java集合详解1.java集合概述2.java集合与数组的区别3.java集合的特点4.java集合框架图5.java集合体系5.1迭代器Iterator5.2Collection接口5.2.1List子接口Arr......
  • go语言的结构体、指针、方法详解
    资源来自:https://blog.csdn.net/DXB2021/article/details/122652779结体体定义如下:typeauthorstruct{field1type1field2type2...}结构体的定义格式如下:type类......
  • (转载)Linux目录详解,软件应该安装到哪个目录
    Linux目录详解,软件应该安装到哪个目录我们应该知道Windows有一个默认的安装目录专门用来安装软件。Linux的软件安装目录也应该是有讲究的,遵循这一点,对后期的管理和维......
  • Hadoop的由来、Block切分、进程详解
    Hadoop的由来、Block切分、进程详解一、hadoop的由来Google发布了三篇论文:GFS(GoogleFileSystem)MapReduce(数据计算方法)BigTable:HbaseDougcutting花费了两......
  • 基础树上问题之 树的直径 + 最近公共祖先 例题及学习笔记(入门版)
    本篇博客是关于洛谷题单【图论2-1】基础树上问题的题目题解合集紫题还不会,先鸽同时附加一点我的个人学习心得基础树上问题除了树形dp外,还有树的直径和LCA等问题......
  • Json详解
    Json介绍我们在开发基于网络的程序时,经常会使用到JSON。相比xml这种数据交换格式来说,json相对解析更加简单一些,因此客户端和服务器的数据交换格式往往通过json进行交换。......
  • 基于element-ui 动态换肤的代码详解
    1、在安装好[email protected]以后,首先安装sass-loadernpmisass-loadernode-sass-D2、安装element-themenpmielement-theme-D3、安装theme-chalknpmielem......