BZOJ2120 数颜色 莫队 带修莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html
题目传送门 - BZOJ2120
题意
给定一个长度为 $n$ 的序列 $a$ ,有 $m$ 次操作,每次操作可能是如下两种类型之一:
1. 询问区间不同值的个数。
2. 修改一个 $a_i$ 。
对于每一次询问,输出结果。
$n,m\leq 10000,\ \ \ \ 1\leq a_i\leq10^6$
题解
带修莫队裸题。
打错一个变量找了20分钟。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=10005,M=1000005;
int n,m,Qcnt=0,Ocnt=0;
int c[N],dc[N],k[N];
int tax[M],tot=0;
struct Query{
int L,R,id,ans;
Query(){}
Query(int _L,int _R,int _id){
L=_L,R=_R,id=_id;
}
}Q[N];
struct Operation{
int x,v1,v2,id;
Operation(){}
Operation(int _x,int _v1,int _v2,int _id){
x=_x,v1=_v1,v2=_v2,id=_id;
}
}O[N];
bool cmp(Query a,Query b){
if (k[a.L]!=k[b.L])
return k[a.L]<k[b.L];
if (k[a.R]!=k[b.R])
return k[a.R]<k[b.R];
return a.id<b.id;
}
bool cmpid(Query a,Query b){
return a.id<b.id;
}
int L=1,R=0,t=0;
void update(int t){
int x=O[t].v1,y=O[t].v2,id=O[t].x;
if (c[id]!=x)
swap(x,y);
if (L<=id&&id<=R){
tot-=(--tax[x])==0;
tot+=(tax[y]++)==0;
}
c[id]=y;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&c[i]),dc[i]=c[i];
for (int i=1;i<=m;i++){
char ch[2];
int x,y;
scanf("%s%d%d",ch,&x,&y);
if (ch[0]=='Q')
Q[++Qcnt]=Query(min(x,y),max(x,y),i);
else {
O[++Ocnt]=Operation(x,y,dc[x],i);
dc[x]=y;
}
}
for (int i=1;i<=n;i++)
k[i]=(i-1)/400;
sort(Q+1,Q+Qcnt+1,cmp);
memset(tax,0,sizeof tax);
O[0].id=0,O[Ocnt+1].id=m+1;
for (int i=1;i<=Qcnt;i++){
while (L<Q[i].L)
tot-=(--tax[c[L++]])==0;
while (L>Q[i].L)
tot+=(tax[c[--L]]++)==0;
while (R<Q[i].R)
tot+=(tax[c[++R]]++)==0;
while (R>Q[i].R)
tot-=(--tax[c[R--]])==0;
while (O[t+1].id<Q[i].id)
update(++t);
while (O[t].id>Q[i].id)
update(t--);
Q[i].ans=tot;
}
sort(Q+1,Q+Qcnt+1,cmpid);
for (int i=1;i<=Qcnt;i++)
printf("%d\n",Q[i].ans);
return 0;
}
BZOJ2120 数颜色 莫队 带修莫队的更多相关文章
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...
- [BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)
传送门 只有第一个,第二个权限题. 分块,然而wa,没看出来错在哪里,有时间再看. #include <cmath> #include <cstdio> #include &l ...
- luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...
- BZOJ2120 数颜色 【带修莫队】
BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...
- 【BZOJ2120】数颜色(带修莫队)
点此看题面 大致题意:告诉你\(n\)只蜡笔的颜色,有两种操作:第一种操作将第\(x\)只蜡笔颜色改成\(y\),第二种操作询问区间\([l,r]\)内有多少种颜色的蜡笔. 考虑普通莫队 这题目第一眼 ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
随机推荐
- python old six day
今天主要内容: . is 和== 的区别 . 编程的问题 一. is和==的区别! is 比较的是内存地址 == 比较的是值 记住结果就好 ⑴id 通过id() 我们查看到一个变量表示 ...
- HTML阻止冒泡事件的发生
阻止事件冒泡函数(低级标签的点击事件触发后,上级标签的点击事件再触发,此函数就是防止冒泡事件发生) function stopEventBubble(event){ var e=event || wi ...
- liunx 利用nginx 实现负载均衡
一般采用软件实现负载均衡的有Nginx.apache.nginx 近年来使用频繁,其官网上面显示可以承载5万并发访问量,太牛了. nginx 相比 apache优势明显:Nginx 服务程序比较稳定, ...
- 终于,我还是下决心学Java后台了
我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了.最近计划学习Java后台,因为最近接了私活的问题,好多都要Java后台和前端一起做.平常我在做什么,当然是忙着赚钱了 除了敲代码,你还有什么副业 ...
- swift 实践- 11 -- UISlider
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...
- swift 学习- 25 -- 协议 02
// 通过扩展添加协议一致性 // 即便无法修改源代码, 依然可以通过扩展 令已有类型遵循并符合协议, 扩展可以为已有类型添加属性, 方法, 下标 以及构造器, 因此可以符合协议中的相应要求 // 注 ...
- STM32L476应用开发之四:触摸屏驱动与数据交互
数据交互可以说是任何一台仪器都需要的功能.我们的便携式气体分析仪,需要人来操作和配置,所以触摸屏就是我们必然的一个选择.本次我们计划采用3.5寸显示屏,串口通讯. 1.硬件设计 前面我们实验了串行通讯 ...
- Confluence 6 修改站点图标(favicon)
你也可以修改你站点的图标(这个站点图标将会在你浏览器的标签页上显示).你需要 Confluence 的管理员权限才能进行修改. 进入 > 基本配置(General Configuration) ...
- python之内置模块random(转载)
转载自http://www.cnblogs.com/wcwnina/p/9281334.html random.seed(a=None, version=2) # 初始化伪随机数生成器,若种子a相同, ...
- Cpython支持的进程与线程
一.multiprocessing模块介绍 python中的多线程无法利用CPU资源,在python中大部分情况使用多进程.python中提供了非常好的多进程包multiprocessing. mul ...