[洛谷P1903][国家集训队]数颜色
题目大意:有$n$支画笔,有两个操作
- $Q\;l\;r:$询问$[l,r]$中有几种颜色
- $R\;p\;Col:$把第$p$支画笔的颜色改成$Col$
题解:带修莫队,分为$n^{\frac{1}{3}}$个块,每个块$n^{\frac{2}{3}}$个元素,复杂度$O(n^{\frac{5}{3}})$
卡点:读入时,修改的时间赋值错
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 50010
#define bl(x) (x >> 10)
int n, m, Qcnt, Mcnt;
int C[maxn], ans[maxn], cnt[1000010];
struct Query {
int l, r, t, id;
inline bool operator < (const Query &rhs) const {
return bl(l) == bl(rhs.l) ? (bl(r) == bl(rhs.r) ? t < rhs.t : r < rhs.r) : l < rhs.l;
}
} Q[maxn];
struct Modify {
int pos, t, col;
} M[maxn];
int l = 0, r = 0, p = 0, res = 0;
inline void swap(int &a, int &b) {a ^= b ^= a ^= b;}
void modify(int x) {
if (M[x].pos >= l && M[x].pos <= r) {
res -= --cnt[C[M[x].pos]] == 0;
res += cnt[M[x].col]++ == 0;
}
swap(M[x].col, C[M[x].pos]);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &C[i]);
for (int i = 1; i <= m; i++) {
char op[10];
scanf("%s", op);
if (*op == 'Q') {
Qcnt++;
scanf("%d%d", &Q[Qcnt].l, &Q[Qcnt].r);
Q[Qcnt].t = i;
Q[Qcnt].id = Qcnt;
} else {
Mcnt++;
scanf("%d%d", &M[Mcnt].pos, &M[Mcnt].col);
M[Mcnt].t = i;
}
}
std::sort(Q + 1, Q + Qcnt + 1);
for (int i = 1; i <= Qcnt; i++) {
while (l > Q[i].l) res += cnt[C[--l]]++ == 0;
while (r < Q[i].r) res += cnt[C[++r]]++ == 0;
while (l < Q[i].l) res -= --cnt[C[l++]] == 0;
while (r > Q[i].r) res -= --cnt[C[r--]] == 0;
while (p < Mcnt && M[p + 1].t <= Q[i].t) modify(++p);
while (p && M[p].t > Q[i].t) modify(p--);
ans[Q[i].id] = res;
}
for (int i = 1; i <= Qcnt; i++) printf("%d\n", ans[i]);
return 0;
}
[洛谷P1903][国家集训队]数颜色的更多相关文章
- 洛谷 P1903 [国家集训队]数颜色 解题报告
P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- ●洛谷P1903 [国家集训队]数颜色
题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...
- 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )
题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- 洛谷 P1903 [国家集训队]数颜色
题意简述 给定一个数列,支持两个操作 1.询问l~r有多少不同数字 2.修改某个数字 题解思路 带修莫队 如果修改多了,撤销修改 如果修改少了,进行修改 代码 #include <cmath&g ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)
题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...
随机推荐
- Make a Person-freecodecamp算法题目
Make a Person 1.要求 用下面给定的方法构造一个对象:方法有 getFirstName(), getLastName(), getFullName(), setFirstName(fir ...
- mysql5.6 配置 文件
mysql 3306 主库配置文件 [client] port = 3306 default-character-set=utf8mb4 socket = /ssd/mysql/3306/tmp/my ...
- DNS的主从,转发与负载功能
接着原来<DNS原理与应用>的文章,本章内容主要通过实现DNS的主从,转发,及基于域名解析不同的ip实现后端服务负载均衡的效果.最后再实现DNS的高级功能:类似CDN原理实现基于IP实现区 ...
- Java源码解析——Java IO包
一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...
- 40.VUE学习之--组件之间的数据传参父组件向子组件里传参,props的使用实例操作
父组件向子组件里传参,props的使用实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- POJ 2441 状压DP
Arrange the Bulls Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 5289 Accepted: 2033 ...
- HyperLedger Fabric 1.4 区块链技术定义(2.1)
区块链技术指使用点对点传输.共识机制.加密算法等技术,保证分布式数据库区块写入链中数据的一致性,达到去中心化和不可篡改的目的. 区块链就是一种特殊的分布式数据库,使用现有的各种成熟的技术, ...
- poj 3111 卖珠宝问题 最大化平均值
题意:有N件分别价值v重量w的珠宝,希望保留k件使得 s=v的和/w的和最大 思路:找到贡献最大的 设当前的s为mid(x) 那么贡献就是 v-w*x 排序 ,取前k个 bool operator&l ...
- 5. css定位 居中
1.准备工作 (1)添加背景图片 background: url('images/grass.png') (2)背景图片格式 background-size:contain; #完全限制在方框 #co ...
- ElasticSearch学习笔记(五)-- 排序、分页与遍历
1. 相关性算分 这样能够查询到不同分片上的文档的准确算分,默认分片为5 2. sorting-doc-values-fielddata 3. 分页与遍历