经典颜色问题推荐博文

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的项链的更多相关文章

  1. 【离线做法 树状数组】luoguP1972 [SDOI2009]HH的项链

    与bzoj3585: mex的线段树做法有着异曲同工之妙 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  2. [luoguP1972] [SDOI2009]HH的项链(莫队 || 树状数组 || 主席树)

    传送门 莫队基础题,适合我这种初学者. 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] ...

  3. BZOJ 1878: [SDOI2009]HH的项链

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3548  Solved: 1757[Submit][Statu ...

  4. 【BZOJ1878】[SDOI2009]HH的项链 离线BIT

    1878: [SDOI2009]HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义 ...

  5. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. Bzoj 1878: [SDOI2009]HH的项链 莫队

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2717  Solved: 1363[Submit][Statu ...

  7. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

  8. 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  9. BZOJ_1878_[SDOI2009]HH的项链_莫队

    BZOJ_1878_[SDOI2009]HH的项链_莫队 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考 ...

随机推荐

  1. [Linux] Nginx服务下统计网站的QPS

    单位时间的请求数就是QPS,那么在nginx服务的网站下,如果要统计QPS并且按从高到低排列,需要使用awk配合sort进行处理awk做的主要工作是把access每行日志按分隔符分开,然后循环每一行, ...

  2. day95_11_28,selenium定位元素,cookies获取

    一.selenium selenium可以将一些资源定位: # 1.find_element_by_id 根据id找 # 2.find_element_by_link_text 根据链接名字找到控件( ...

  3. SpringCloud单元测试【六】

    SpringCloud的单元测试主要是依靠 Mock以及Mockito, 所以我们需要对Mock以及Mockito有一定的认识. 一.为什么要用MockMvc 可能我们在测试控制层的代码都是启动服务器 ...

  4. LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速

    问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...

  5. 简单App项目的运行

    我和我的同伴两个人从网上下载一个仿微信登录源码,导入到eclipse中,两人结队练习这个源代码的操作, 运行项目到Android虚拟器上,显示效果为 我们还运行这个项目到手机设备上,显示效果为   接 ...

  6. Codeforces Round #603 (Div. 2) B. PIN Codes 水题

    B. PIN Codes A PIN code is a string that consists of exactly 4 digits. Examples of possible PIN code ...

  7. 解决上一篇bean.xml中<bean>标签报错“ Error while downloading 'http://www.springframework.org/schema/beans/spring-beans.xsd........”

    在xml文件中,头部报错如题 一开始查询,说是头部少了“<?xml version="1.0" encoding="UTF-8"?>”,但是我并没有 ...

  8. MySQL数据库查询所有表名

    查找指定库中所有表名 select table_name from information_schema.tables where table_schema='db_name'; 注:替换db_nam ...

  9. Python 学习 第16篇:数据类型(字典和Json)

    字典是键/值对构成的集合,字典通过大括号来创建,字典的键是字符串,而值可以是任何数据对象. 字典有两个重要的特征: 字典是无序的,字典项没有特定的顺序,只能通过键来获取值: 字典是可变的,支持原处修改 ...

  10. java高并发系列 - 第3天:有关并行的两个重要定律

    有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处于两个目的. 第一,为了获得更好的性能: 第二,由于业务模型的需要,确实需要多个执行实体. 在这里,我将更加关注第一种 ...