BZOJ2120 数颜色 【带修改莫队】
2120: 数颜色
Time Limit: 6 Sec Memory Limit: 259 MB
Submit: 6579 Solved: 2625
[Submit][Status][Discuss]
Description
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?
Input
第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。
Output
对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。
Sample Input
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
Sample Output
4
3
4
HINT
对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
2016.3.2新加数据两组by Nano_Ape
第一次用带修改的莫队
实际就是记录下所有的修改,对于每个询问记录下该询问属于修改了几次时的询问
当到达一个询问时,若当前修改次数不符,就转移修改至当前询问所在修改
为了优化时间,我们按①块②右端点③修改次数 排序
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define LL long long int
- #define REP(i,n) for (int i = 1; i <= (n); i++)
- #define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
- using namespace std;
- const int maxn = 10005,maxm = 1000005,INF = 1000000000;
- inline int RD(){
- int out = 0,flag = 1; char c = getchar();
- while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
- while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
- return out * flag;
- }
- int co[maxn],N,M,T,nq = 0,nt = 0,ans[maxn],tot[maxm];
- struct Que{int l,r,tim,b,id;}Q[maxn];
- struct Cha{int pos,from,to;}C[maxn];
- inline bool operator <(const Que& a,const Que& b){
- if (a.b != b.b) return a.b < b.b;
- else if (a.r != b.r) return a.r < b.r;
- return a.tim < b.tim;
- }
- void solve(){
- int t = nt,L = 0,R = 0,cnt = 0;
- for (int i = 1; i <= nq; i++){
- while (t > Q[i].tim){
- if (C[t].pos >= L && C[t].pos <= R){
- if (!(--tot[C[t].to])) cnt--;
- if (!tot[C[t].from]++) cnt++;
- }
- co[C[t].pos] = C[t].from; t--;
- }
- while (t < Q[i].tim){
- t++;
- if (C[t].pos >= L && C[t].pos <= R){
- if (!(--tot[C[t].from])) cnt--;
- if (!tot[C[t].to]++) cnt++;
- }
- co[C[t].pos] = C[t].to;
- }
- while (L < Q[i].l){if (!(--tot[co[L++]])) cnt--;}
- while (L > Q[i].l){if (!tot[co[--L]]++) cnt++;}
- while (R < Q[i].r){if (!tot[co[++R]]++) cnt++;}
- while (R > Q[i].r){if (!(--tot[co[R--]])) cnt--;}
- ans[Q[i].id] = cnt;
- }
- }
- int main(){
- N = RD(); M = RD(); T = (int)sqrt(N); char cmd;
- REP(i,N) co[i] = RD();
- REP(i,M){
- cmd = getchar(); while (cmd != 'Q' && cmd != 'R') cmd = getchar();
- if (cmd == 'Q') Q[++nq].l = RD(),Q[nq].r = RD(),Q[nq].tim = nt,Q[nq].b = Q[nq].l / T,Q[nq].id = nq;
- else C[++nt].pos = RD(),C[nt].from = co[C[nt].pos],co[C[nt].pos] = C[nt].to = RD();
- }
- sort(Q + 1,Q + 1 + nq);
- solve();
- REP(i,nq) printf("%d\n",ans[i]);
- return 0;
- }
BZOJ2120 数颜色 【带修改莫队】的更多相关文章
- BZOJ2120数颜色(带修改莫队)
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
- [国家集训队][bzoj2120] 数颜色 [带修改莫队]
题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- bzoj 2120 数颜色 带修改莫队
带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...
- bzoj2120 数颜色——带修莫队
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 带修改的莫队: 用结构体存下修改和询问,排好序保证时间后就全局移动修改即可: 参考了T ...
- P1903 [国家集训队]数颜色 (带修改莫队)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- BZOJ2120 数颜色 —— 待修改莫队
题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: ...
- P1903 [国家集训队]数颜色 带修改莫队板子
大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...
- COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)
题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...
- bzoj2120: 数颜色 带修莫队
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
随机推荐
- JENKINS系统的安装部署
JENKINS 安装使用文档 简介 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成,集成Jenkins可 ...
- 设置Git 记住密码
设置记住密码(默认15分钟): git config --global credential.helper cache 如果想自己设置时间,可以这样做: git config credential.h ...
- C++11中std::move的使用
std::move is used to indicate that an object t may be "moved from", i.e. allowing the effi ...
- linux安装oracle远程客户端
文章参考:http://blog.csdn.net/caomiao2006/article/details/11901123 感谢博友分享O(∩_∩)O~ 安装oracle 远程客户端(一般情况下本地 ...
- Go中的系统Signal处理
package main import "fmt" import "os" import "os/signal" import " ...
- 【C#】 反射
[C#] 反射 目录 : http://msdn.microsoft.com/zh-cn/library/System.Reflection(v=vs.110).aspx System.Reflect ...
- gitk中文乱码问题处理
执行了 git config --global gui.encoding utf- 查看 %USERPROFILE%\.gitconfig 文件中也有 [gui] encoding = utf-8 在 ...
- APK反编译后添加日志
一.反编译 参考前一篇文章 二.添加寄存器(locals) 因为要添加日志,我们一般需要用一个变量来存储TAG,所以需要增加一个寄存器 如: # virtual methods .method pub ...
- PowerMock简单使用
网上有很多PowerMock的介绍,此处就不再罗列 下面给出一些资源地址以及几篇案例 mockito资源: (1)源码:https://github.com/mockito/mockito power ...
- lessJs
lessJs下载地址 ======== 简介 lessJs主要提供页面切换,页面管理的一个框架:less-ui.css 和 less-ui.js 是独立于less.js的,他们提供的是一组ui,包括消 ...