luoguP1972 [SDOI2009]HH的项链
经典颜色问题推荐博文
https://www.cnblogs.com/tyner/p/11519506.html
https://www.cnblogs.com/tyner/p/11616770.html
https://www.cnblogs.com/tyner/p/11620894.html
题意
求一段区间中的元素种类, 同一个元素可能有多个,但是只记
一次, 多组询问
长度 <= 1000000, 询问次数 <= 200000
记得写快读
分析
重复颜色, 套路题
处理nxt, 枚举左端点,考虑''移动左端点''这一操作对区间答案的影响
具体做法来自: 150137
没有修改,我们不妨离线
我们将询问按照左端点排序, 然后维护一个当前的左指针和询问的左指针, 再维护一个 next 数组表示该物品的下一个相同元素物品的位置
维护一个 ans 数组, 每次当 l < ql 的时候, 更新 nextl, 然后 l 前
移继续即可,询问就是求前缀和啦
#include<cstdio>
#include<algorithm>
using namespace std;
#define lowbit(x) (x&-x)
inline int read() {
char ch = getchar(); int f = 1, x = 0;
while(ch<'0' || ch>'9') {if(ch == '-') f = -1; ch = getchar();}
while(ch>='0' && ch<='9') {x = x*10+ch-'0'; ch = getchar();}
return x*f;
}
const int MAX = 1000000+99;
int n, m, max_;
int arr[MAX], nxt[MAX], lst[MAX];
int t[MAX];
struct node{
int l, r;
int ans, id;
}cmd[MAX];
bool cmp1(node a, node bb) {
return a.l < bb.l;
}
bool cmp2(node a, node bb) {
return a.id < bb.id;
}
void add(int x, int k) {
while(x <= n) {t[x] += k; x += lowbit(x);}
}
int query(int x) {
int res = 0;
while(x) {res += t[x]; x -= lowbit(x);}
return res;
}
void pre() {
n = read();
for(int i = 1; i <= n; i++) arr[i] = read(), max_ = max(max_, arr[i]);
for(int i = n; i >= 1; i--) {//颜色问题--处理nxt[]
nxt[i] = lst[arr[i]];
lst[arr[i]] = i;
}
// for(int i = 1; i <= n; i++) printf("%d %d\n", nxt[i], lst[i]);
for(int i = 1; i <= max_; i++) if(lst[i]) add(lst[i], 1);//初始化l==1的状态(注意判颜色是否存在
// 注意lst的下标是颜色,保存的是每个颜色第一次出现的位置坐标,所以是<=max_
m = read();
for(int i = 1; i <= m; i++) cmd[i].id = i,cmd[i].l = read(), cmd[i].r = read();
sort(cmd+1, cmd+1+m, cmp1);//按 l 从小到大排序
}
void solve() {
int pos = 1;
for(int l = 1; l <= n; l++) {//枚举左端点
while(l == cmd[pos].l) {
cmd[pos].ans = query(cmd[pos].r);
++pos;
}
add(l, -1);
if(nxt[l]) add(nxt[l], 1);
}
sort(cmd+1, cmd+1+m, cmp2);
for(int i = 1; i <= m; i++) printf("%d\n", cmd[i].ans);
}
int main() {
pre();
solve();
return 0;
}
luoguP1972 [SDOI2009]HH的项链的更多相关文章
- 【离线做法 树状数组】luoguP1972 [SDOI2009]HH的项链
与bzoj3585: mex的线段树做法有着异曲同工之妙 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- [luoguP1972] [SDOI2009]HH的项链(莫队 || 树状数组 || 主席树)
传送门 莫队基础题,适合我这种初学者. 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] ...
- BZOJ 1878: [SDOI2009]HH的项链
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3548 Solved: 1757[Submit][Statu ...
- 【BZOJ1878】[SDOI2009]HH的项链 离线BIT
1878: [SDOI2009]HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义 ...
- BZOJ 1878: [SDOI2009]HH的项链 离线树状数组
1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- Bzoj 1878: [SDOI2009]HH的项链 莫队
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2717 Solved: 1363[Submit][Statu ...
- BZOJ 1878: [SDOI2009]HH的项链( BIT )
离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- BZOJ_1878_[SDOI2009]HH的项链_莫队
BZOJ_1878_[SDOI2009]HH的项链_莫队 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考 ...
随机推荐
- 01-Node.js学习笔记-模块成员的导出导入
什么是Node.js Node.js是一个让javascript运行在服务端的开发平台: Node.js能做什么? 1.基于社交网络的大规模web应用: 2.命令行工具 3.交互式终端程序 4.带有图 ...
- canvas详解----绘制线条
<!DOCTYPE html> <html> <head> <title>canvas详解</title> </head> &l ...
- charles使用(安装、mock、限速、断点功能)
我们在进行B/S架构的Web项目开发时,在前端页面与后台交互的调试的时候,通常使用在JSP中加入“debugger;”断点,然后使用浏览器的F12开发者工具来查看可能出错的地方的数据.或者使用Http ...
- acwing 651. 逛画展
地址 https://www.acwing.com/problem/content/653/ 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那 ...
- Node.js使用Nodemailer发送邮件
除了Python,在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用.Nodemailer包就可以帮助我们快速实现发送邮件的功能. Nodemailer简介 Nodem ...
- WPF 精修篇 自定义控件
原文:WPF 精修篇 自定义控件 自定义控件 因为没有办法对界面可视化编辑 所以用来很少 现在实现的是 自定义控件的 自定义属性 和自定义方法 用VS 创建自定义控件后 会自动创建 Themes 文件 ...
- WPF 精修篇 page
原文:WPF 精修篇 page 前言 前段时间看UML 大象 这本书 虽然马上看到了精华片 最后还是暂时暂停 因为这本书 很好 但是暂时对现在的我来说 有点超前 很多东西理解起来还是很难 但是 这本书 ...
- CSP-S 2019文澜中学游记(11.15~11.17)
前言 今年的\(CSP-S\),本以为自己的实力与去年的\(NOIP\)相比,能有较大的提升的. 没想到,菜是原罪,弱就是弱,依然逃脱不了被吊锤的命运. \(Nov\ 15th\):\(Day\ 0\ ...
- Redis 内存淘汰机制
Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷.Redis最常见的两种应用场景为 ...
- 程序员,你还不会合理选择Filter、Interceptor、Aspect?
小伙伴们应该听说过过滤器.拦截器.切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别. 过滤器可以拦截到方法的请求和响应 (ServletRe ...