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 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
随机推荐
- 前端知识点总结(html+css)部分
HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据库获取数据,然后替换到html文件的指定位置(W ...
- 51NOD1522 上下序列/CF567F Mausoleum DP
题目传送门:http://codeforces.com/problemset/problem/567/F 大致题意:你有$1$到$N$的所有正整数每个数两个,现在需要你将它排成一个序列,使得序列为单峰 ...
- Spring Aop: 关于继承和execution target this @annotation
1.多态 target指通过这个对象调用的方法 (匹配标识对象的所有方法) getMethod() this指调用这个对象的方法 (匹配标识对象实现的方法) getDeclaredMethod( ...
- Spring Boot(十六):使用 Jenkins 部署 Spring Boot
Jenkins 是 Devops 神器,本篇文章介绍如何安装和使用 Jenkins 部署 Spring Boot 项目 Jenkins 搭建.部署分为四个步骤: 第一步,Jenkins 安装 第二步, ...
- @Vue/Cli 3 关于 render 空的处理
问题场景 vue-cli 3 在打包部署时候会出现 dist folder not working "Uncaught TypeError: Cannot set property 'ren ...
- windows下docker启动.net core mvc随手记
docker基本命令: 查看当前的版本docker--version查看本地所有镜像:docker images查看当前正在运行的所有容器docker ps停止某个容器:docker stop 容器I ...
- 支持自定义协议的虚拟仪器【winform版】
首先,这个程序的由来,额,工作以来,做的最久的就是上位机,对市面上的大部分组态软件都感到不满,不好用,LabView虽然用起来不错,但是入门还是不够简单,刚好现在工作比较闲(已经不再做上位机了),所以 ...
- NTP系统时间同步-操作记录
在初始化一台linux服务器后,发现这台服务器的时间不对[root@dev ~]# date2016年 10月 11日 星期二 07:04:34 CST Linux时钟分为系统时钟 (System C ...
- 一个数据表通过另一个表更新数据(在UPDAT语句中使用FROM子句)
在sql server中,update可以根据一个表的信息去更新另一个表的信息. 首先看一下语法: update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHE ...
- Buy the Ticket HDU 1133
传送门 [http://acm.hdu.edu.cn/showproblem.php?pid=1133] 题目描述和分析 代码 #include<iostream> #include< ...