bzoj 2120 数颜色 (带修莫队)
题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=2120
题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改
思路:
带修莫队与普通莫队不同之处就是,带修莫队可以支持修改操作,我们可以再维护一维来表示操作的时间,那么离线处理询问时,我们就需要维护 l,r,t,三根指针,同时因为是三根指针
块的大小分成 n的2/3次方,其他地方和普通莫队维护是一样的,只是多维护了一维操作时间,可能看上去会绕一点。
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e4 + ; struct node{
int l,r,t,id;
node(int l=,int r=,int t=,int id=):l(l),r(r),t(t),id(id){}
}q[M]; struct node1{
int pos,now,old;
node1(int pos=,int now=,int old=):pos(pos),now(now),old(old){}
}c[M]; int n,m,block,l,r,num[M],a[M],now[M],flag[M*],ans;
//排序优先度如果l,r都在一个块中,那么优先选择t小的
bool cmp(node a,node b){
if(a.l/block != b.l/block){
if(a.r/block != b.r/block){
return a.t < b.t;
}
return a.r < b.r;
}
return a.l < b.l;
} void add(int col,int val){
flag[col] += val;
if(val > ) ans += (flag[col] == );
else if(val < ) ans -= (flag[col]==);
} void solve(int pos,int col){
if(pos >= l&&pos <= r) add(col,),add(a[pos],-);
a[pos] = col;
} int main()
{
scanf("%d%d",&n,&m);
block = (int)pow(n,2.0/3.0);
for(int i = ;i <= n;i ++){
scanf("%d",&a[i]);
now[i] = a[i]; //now[i] i点现在的颜色
}
int k = ;
int cnt = ; ans = ;
for(int i = ;i < m;i ++){
char op[];
int x,y;
scanf("%s%d%d",&op,&x,&y);
if(op[] == 'Q'){
//将询问的区间左右节点,在第k次修改之后,第cnt个询问等信息存到结构体q中
q[++cnt] = node(x,y,k,cnt);
}
else {
//将第k次修改的点的左边,要修改的颜色,这个点之前的颜色,存到结构体里
c[++k] = node1(x,y,now[x]);
now[x] = y; //x点现在的颜色变为y
}
}
sort(q+,q+cnt+,cmp);
l = ; r = ;
int tim = ;
for(int i = ;i <= cnt;i ++){
while(tim < q[i].t) solve(c[tim+].pos,c[tim+].now),tim++;
while(tim > q[i].t) solve(c[tim].pos,c[tim].old),tim--;
while(q[i].l < l) add(a[l-],),l--;
while(q[i].l > l) add(a[l],-),l++;
while(q[i].r < r) add(a[r],-),r--;
while(q[i].r > r) add(a[r+],),r++;
num[q[i].id] = ans;
}
for(int i = ;i <= cnt;i ++)
printf("%d\n",num[i]);
return ;
}
bzoj 2120 数颜色 (带修莫队)的更多相关文章
- BZOJ 2120 数颜色 (带修莫队)
		
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
 - bzoj 2120 数颜色 带修改莫队
		
带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...
 - bzoj2120 数颜色——带修莫队
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 带修改的莫队: 用结构体存下修改和询问,排好序保证时间后就全局移动修改即可: 参考了T ...
 - 【bzoj2120】数颜色 带修莫队
		
数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画 ...
 - bzoj2120: 数颜色 带修莫队
		
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
 - BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
		
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
 - NOI模拟 颜色 - 带修莫队/树套树
		
题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...
 - BZOJ2120数颜色(带修改莫队)
		
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
 - BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
		
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
 
随机推荐
- linux内存源码分析 - SLAB分配器概述
			
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...
 - day88
			
ContentType 场景需求:比方说我们现有两种商品,但是他们对应着一个价格策略表,为了防止数据库的浪费,我们在价格策略中加入一个表名字段,一个表明对应的id字段,这样的设计既优化了数据库,还不怕 ...
 - Luogu4423 BJWC2011 最小三角形 平面最近点对
			
传送门 题意:给出$N$个点,求其中周长最小的三角形(共线的也计算在内).$N \leq 2 \times 10^5$ 这道题唤起了我对平面最近点对的依稀记忆 考虑平面最近点对的分治,将分界线两边的求 ...
 - Bitcoin 使用及配置记录
			
常用配置 bitcoin-qt.exe -testnet -printtoconsole -conf=D:\Bitcoin\bitcoin.conf -datadir=D:\Bitcoin\Data ...
 - Bootstrap Modal 使用remote从远程加载内容
			
Bootstrap的Modal这个模态窗组件还是很好用的,但在开发的过程中模态窗中的内容大部分都是从后端加载的.要实现模态窗的内容是从后端加载话,常用的实现方式有2种.它们是: (1) ...
 - python打印列表的下标和值的例子:
			
python打印列表的下标和值的例子: In [1]: list01=[1,4,5] In [10]: def funct01(ll): ....: for index,value in ...
 - assert_param函数的用法
			
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用.如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义 ...
 - hibernate 4 需要导入的jar包
			
<!-- 下面是导入 hibernate 必须的 jar 包 --> <!-- https://mvnrepository.com/artifact/antlr/antlr --&g ...
 - R实战 第十篇:列联表和频数表
			
列联表是观测数据按两个或更多属性(定性变量)分类时所列出的频数分布表,它是由两个以上的变量进行交叉分类的频数分布表.交互分类的目的是将两变量分组,然后比较各组的分布状况,以寻找变量间的关系. 按两个变 ...
 - 如何看待P2P领域的羊毛党?
			
本文来自网易云社区 不利:不利的影响应该是显而易见的,前面的题主也有解释过.总结来说,不利的影响主要是两点: a. 对平台毛利和资金的损害.一般来说,优惠活动本是一个用户只能享用一次,但如果注册多个账 ...