【BZOJ】2120: 数颜色
题解
练习一下带修改莫队
先按照左端点的块排序,再按照右端点的块排序,然后按照时间排序
每个修改操作存一下修改前这个位置的值就可以逆序操作了
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 10005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,M,S;
int c[1000005],res,ans[MAXN],op[MAXN],col[2][MAXN],tot,id[MAXN],a[MAXN],tmp[MAXN];
int p,q,x;
struct qry_node {
int id,l,r,bl,br;
friend bool operator < (const qry_node &a,const qry_node &b) {
if(a.bl != b.bl) return a.bl < b.bl;
if(a.br != b.br) return a.br < b.br;
return a.id < b.id;
}
}qry[MAXN];
void update_pos(int pos,int v) {
if(c[pos] == 0 && c[pos] + v == 1) ++res;
else if(c[pos] == 1 && c[pos] + v == 0) --res;
c[pos] += v;
}
void Change(int t) {
if(t > x) {
for(int i = x + 1 ; i <= t ; ++i) {
if(op[i]) {
if(op[i] <= q && op[i] >= p) {
update_pos(a[op[i]],-1);
update_pos(col[1][i],1);
}
a[op[i]] = col[1][i];
}
}
}
else {
for(int i = x ; i > t ; --i) {
if(op[i]) {
if(op[i] <= q && op[i] >= p) {
update_pos(a[op[i]],-1);
update_pos(col[0][i],1);
}
a[op[i]] = col[0][i];
}
}
}
x = t;
}
void Move(int l,int r) {
while(q < r) {update_pos(a[++q],1);}
while(p > l) {update_pos(a[--p],1);}
while(q > r) {update_pos(a[q--],-1);}
while(p < l) {update_pos(a[p++],-1);}
}
void Solve() {
read(N);read(M);
S = pow(N,2.0 / 3.0);
int h = 0;
for(int i = 1 ; i <= N ; ++i) {read(a[i]);tmp[i] = a[i];}
for(int i = 1 ; i <= N ; i += S) {
int r = min(i + S - 1,N);
++h;
for(int j = i ; j <= r ; ++j) {
id[j] = h;
}
}
char s[5];
int l,r;
for(int i = 1 ; i <= M ; ++i) {
scanf("%s",s + 1);
read(l);read(r);
if(s[1] == 'Q') {
qry[++tot] = (qry_node){i,l,r,id[l],id[r]};
}
else {
op[i] = l;col[1][i] = r;col[0][i] = tmp[l];
tmp[l] = r;
}
}
sort(qry + 1,qry + tot + 1);
x = 0,p = 1,q = 0;
for(int i = 1 ; i <= tot ; ++i) {
Change(qry[i].id);
Move(qry[i].l,qry[i].r);
ans[qry[i].id] = res;
}
for(int i = 1 ; i <= M ; ++i) {
if(!op[i]) {
out(ans[i]);enter;
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【BZOJ】2120: 数颜色的更多相关文章
- BZOJ 2120 数颜色(带修改的莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 3478 Solved: 1342 [Submit][Status][Discus ...
- BZOJ 2120: 数颜色
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3623 Solved: 1396[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 2645 Solved: 1039[Submit][Status][Discuss] ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- BZOJ 2120 数颜色 【带修改莫队】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec Memory Limit: ...
- bzoj 2120 数颜色 题解
转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23990489 [原题] 2120: 数颜色 Time Limit: 6 Sec M ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ 2120 数颜色(带修改莫队)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...
- BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3665 Solved: 1422[Submit][Status][Discuss] ...
随机推荐
- MT【201】折线计数
甲乙两人参加竞选,结果甲得n票,乙得m票(n > m) . 则在唱票过程中,甲的累计票数始终超过乙的累计票数的概率是_____________. 答案:$\dfrac{n-m}{n+m}$
- MT【167】反复放缩
已知数列$\{a_n\}$满足:$a_1=1,a_{n+1}=a_n+\dfrac{a_n^2}{n(n+1)}$1)证明:对任意$n\in N^+,a_n<5$2)证明:不存在$M\le4$, ...
- 【题解】 bzoj1088: [SCOI2005]扫雷Mine (神奇的做法)
bzoj1088,懒得复制,戳我戳我 Solution: 其实这个有个结论,答案只会有\(0\),\(1\),\(2\)三种(我真的是个弱鸡,这个都想不到) 然后我们假设第一个就可以推出所有的状态(显 ...
- 【BZOJ1296】[SCOI2009]粉刷匠(动态规划)
[BZOJ1296][SCOI2009]粉刷匠(动态规划) 题面 BZOJ 洛谷 题解 一眼题吧. 对于每个串做一次\(dp\),求出这个串刷若干次次能够达到的最大值,然后背包合并所有的结果即可. # ...
- AdaBoost原理详解
写一点自己理解的AdaBoost,然后再贴上面试过程中被问到的相关问题.按照以下目录展开. 当然,也可以去我的博客上看 Boosting提升算法 AdaBoost 原理理解 实例 算法流程 公式推导 ...
- NO.4: 确定对象被使用前已被初始化
1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...
- 调试技巧 ------ printf 的使用技巧
编译器宏:__FUNCTION__,__FILE__,__LINE__ #define __debug #ifdef __debug //#define debug(format,...) print ...
- 安装Python和Anaconda
安装Python和Anaconda 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装anaconda anaconda包括了Python的集成开发环境. 1.打开下载的网站 ...
- [整理]Visual Studio 的Application Insights
简单介绍 Application Insights(预览版) Visual Studio 的Application Insights插件简介 Application Insights for Visu ...
- RabbitMq简单应用
服务端: <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...