题目描述

传送门

题解

和BZOJ2453相同,在这里可以看到分块的做法
而这道题同时又是一道带修莫队裸题
带修莫队大体方法如下:
1、将修改询问离线并分开,记录每一个修改之前最近的一次询问的编号
2、分块之后将区间排序,关键字为:左端点块的编号、右端点块的编号、记录的最近一次修改的编号
3、在查询每一次询问之前,判断当前做过的修改是否恰好是这次询问需要的修改,如果不够将其修改,修改多了的话恢复回去,注意如果修改的位置在前一个询问的区间内要更新答案
4、转移询问和普通莫队相同

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 10005int n,m,cq,cc,block,now,ans;
struct data{int x,y,t,id,ans;}q[N],ch[N];
int c[N],num[N],last[N],cnt[N*100];int cmp(data a,data b)
{return num[a.x]<num[b.x]||(num[a.x]==num[b.x]&&num[a.y]<num[b.y])||(num[a.x]==num[b.x]&&num[a.y]==num[b.y]&&a.t<b.t);
}
void modui(int x,int y,int val)
{for (int i=x;i<=y;++i){if (val==1){if (!cnt[c[i]]) ++ans;++cnt[c[i]];}else{--cnt[c[i]];if (!cnt[c[i]]) --ans;}}
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;++i) scanf("%d",&c[i]);block=sqrt(n);for (int i=1;i<=n;++i) num[i]=(i-1)/block+1;for (int i=1;i<=m;++i){char opt=getchar();while (opt!='R'&&opt!='Q') opt=getchar();if (opt=='R'){++cc;scanf("%d %d",&ch[cc].x,&ch[cc].y);}else{++cq;q[cq].id=cq;scanf("%d %d",&q[cq].x,&q[cq].y);q[cq].t=cc;}}sort(q+1,q+cq+1,cmp);now=q[1].t;for (int i=1;i<=q[1].t;++i){last[i]=c[ch[i].x];c[ch[i].x]=ch[i].y;}modui(q[1].x,q[1].y,1);q[q[1].id].ans=ans;for (int i=2;i<=cq;++i){if (now<q[i].t)for (int j=now+1;j<=q[i].t;++j){if (ch[j].x>=q[i-1].x&&ch[j].x<=q[i-1].y){--cnt[c[ch[j].x]];if (!cnt[c[ch[j].x]]) --ans;if (!cnt[ch[j].y]) ++ans;++cnt[ch[j].y];}last[j]=c[ch[j].x];c[ch[j].x]=ch[j].y;}else if (now>q[i].t)for (int j=now;j>q[i].t;--j){if (ch[j].x>=q[i-1].x&&ch[j].x<=q[i-1].y){--cnt[c[ch[j].x]];if (!cnt[c[ch[j].x]]) --ans;if (!cnt[last[j]]) ++ans;++cnt[last[j]];}c[ch[j].x]=last[j];}now=q[i].t;if (q[i].x>q[i-1].x) modui(q[i-1].x,q[i].x-1,-1);else modui(q[i].x,q[i-1].x-1,1);if (q[i].y>q[i-1].y) modui(q[i-1].y+1,q[i].y,1);else modui(q[i].y+1,q[i-1].y,-1);q[q[i].id].ans=ans;}for (int i=1;i<=cq;++i) printf("%d\n",q[i].ans);
}


[BZOJ2120]数颜色(带修改莫队)相关推荐

  1. P1903 数颜色 (带修莫队)

    题目传送门 ~~~ 题目大意 给一个有 n 个元素的数组 a,有 m 次操作,操作如下: Q 操作,询问区间 (l, r) 不同元素的个数 R 操作,把第 x 个元素修改为 y 对于每次 Q 操作,输 ...

  2. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  3. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  4. uoj#58./bzoj3052 【WC2013】糖果公园 //树上带修改莫队

    uoj#58. [WC2013]糖果公园 题意 有一棵N(<=1e5)个点的树,每个点对应M(<=1e5)种糖果中的一种. 一条路径的权值定义为∑i(Vi∗∑tij=1Wj)\sum_i ...

  5. Codeforces 940 F - Machine Learning(带修改莫队, 及注意事项)

    F - Machine Learning You come home and fell some unpleasant smell. Where is it coming from? You are ...

  6. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  7. 带修莫队 ---- 离散化 + 暴力 + 带修莫队 F. Machine Learning

    题目链接 题目大意: 给出nnn个数字,qqq个询问: 每次询问有两种类型,一种是询问区间,一种是单体修改: 询问区间是询问区间内最小的没用到的大于0的整数: 比如我有一串数字是 1 1 2 2 2 ...

  8. 【BZOJ2120】数颜色,带修莫队

    Time:2016.09.08 Author:xiaoyimi 转载注明出处谢谢 思路: 第一次写带修莫队 感觉还是挺简单的 每一次的修改都是一个时间的变动,即修改一次,时间+1(s) 没有修改的查询 ...

  9. 2120: 数颜色(带修莫队)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit ...

  10. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

最新文章

  1. mysql查看存储过程工作记录20130711
  2. Linux疑难杂症解决方案100篇(十二)-ubuntu中安装ftp服务器
  3. Maven教程(一)
  4. 太阳能计算机作文500字,自制太阳能热水器
  5. LeetCode 1707. 与数组中元素的最大异或值(Trie树)
  6. python怎样在一行中捕获多个异常
  7. springboot学习笔记-5 springboot整合shiro
  8. linux的sudo apt-get install 和dpkg -i package.deb命令
  9. vba判断文件编码格式_VBA编写Ribbon Custom UI编辑器07——写入xml
  10. Atitit.软件仪表盘(0)--软件的子系统体系说明
  11. VMware虚拟机XP系统安装图文教程
  12. Android百度浏览器深色模式,深色模式适配指南
  13. HUAWER 华为5G无线数据终端 和 TP-LINK路由器AX6000连接及注意事项
  14. Python该怎样学?我如何快速掌握Python的?
  15. 【转】Vmware 8.0注册码 序列号 key 注册方法
  16. APC PowerChute Business Edition 安装中的vmware问题
  17. Maven的下载以及安装
  18. Android商城项目
  19. day02-HTML的基本标签
  20. 《如何让你爱的人爱上你》——莉尔·朗兹[美]

热门文章

  1. MATLAB量化投资应用培训课程
  2. Python基础训练100题
  3. 2018 文章合集,200+ 篇
  4. 模型预测控制Paolo Falcone 博士面试 (一)
  5. wordpress一主机多站点配置笔记
  6. Maven远程仓库无法连接,本地仓库有jar却仍然去拉远程仓库,导致无法打包问题
  7. 嵌入式Linux驱动开发
  8. 基恩士PLC KV8000+XH16EC总线控制:全ST程序实例与Easy系列电气框架的探讨
  9. Redis青铜修炼手册(一) --- NoSQLRedis介绍
  10. 2021年全球乳果糖浓溶液收入大约154.7百万美元,预计2028年达到172百万美元