【P1972】HH的项链——树状数组+询问离线
(题面摘自luogu)
题目背景
无
题目描述
HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答……因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。
输入输出格式
输入格式:
第一行:一个整数N,表示项链的长度。
第二行:N 个整数,表示依次表示项链中贝壳的编号(编号为0 到1000000 之间的整数)。
第三行:一个整数M,表示HH 询问的个数。
接下来M 行:每行两个整数,L 和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
输出格式:
M 行,每行一个整数,依次表示询问对应的答案。
说明
数据范围:
对于100%的数据,N <= 500000,M <= 500000。
老师讲了两种办法,先只打了第一种。(好像莫队也能做……以后再说)
首先我们把询问离线,按右端点排序。然后我们从左至右扫描原序列(可以离散化):假如我们想处理[l, r]这个询问,我们在扫描序列的时候把每个颜色对应的位置在树状数组中+1,扫描到r的时候直接查询[l, r]的区间和即可。但是布星,有重复的颜色怎么破?
再来考虑我们扫描的过程:一个颜色产生对[l, r]的贡献,当且仅当这个颜色在已扫描序列[1, r]的最右端的位置pos,满足pos >= l。那么我们动态维护某个颜色出现的位置,在扫描的时候一边往BIT里扔贡献,一边删掉该颜色上次出现位置的贡献,然后更新这个颜色的最后一个位置。这时每查到一个询问再询问l, r区间和就是可行的。
代码中有个小细节很坑,可供参考。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- //#define L second
- //#define R first
- //#define mp make_pair
- #define BUG puts("$$$")
- #define lowbit(i) (i & -i)
- #define maxn 500010
- template <typename T>
- void read(T &x) {
- x = 0;
- int f = 1;
- char ch = getchar();
- while (!isdigit(ch)) {
- if (ch == '-')
- f = -1;
- ch = getchar();
- }
- while (isdigit(ch)) {
- x = x * 10 + (ch ^ 48);
- ch = getchar();
- }
- x *= f;
- return;
- }
- using namespace std;
- struct Query {
- int l, r, id;
- friend bool operator < (Query a, Query b) {
- return a.r < b.r;
- }
- } Q[maxn];
- int bit[maxn], a[maxn], pos[maxn], n, m, N;
- int st[maxn], ans[maxn];//辅助
- int contra(int* a) {
- memcpy(st, a, sizeof(st));
- sort(st + 1, st + 1 + n);
- int len = unique(st + 1, st + 1 + n) - st - 1;
- for (int i = 1; i <= n; ++i)
- a[i] = lower_bound(st + 1, st + len + 1, a[i]) - st;
- return len;
- }
- void modify(int x, int del) {
- for (int i = x; i <= n; i += lowbit(i))
- bit[i] += del;
- }
- int query(int l, int r) {
- int sum = 0;
- for (int i = r; i; i -= lowbit(i))
- sum += bit[i];
- for (int i = l - 1; i; i -= lowbit(i))
- sum -= bit[i];
- return sum;
- }
- void solve() {
- register int i = 1, j = 1;//i指向序列,j指向询问
- while (j <= m) {
- while (i <= Q[j].r) {
- if (pos[a[i]])
- modify(pos[a[i]], -1);
- modify(i, 1);
- pos[a[i]] = i;
- ++i;
- }
- --i; //这里:有可能出现右端点相同的情况,不加这句话就跳过了
- ans[Q[j].id] = query(Q[j].l, Q[j].r);
- ++j;
- }
- return;
- }
- int main() {
- read(n);
- for (int i = 1; i <= n; ++i)
- read(a[i]);
- contra(a);
- read(m);
- for (int i = 1; i <= m; ++i)
- read(Q[i].l), read(Q[i].r), Q[i].id = i;
- sort(Q + 1, Q + 1 + m);
- solve();
- for (int i = 1; i <= m; ++i)
- printf("%d\n", ans[i]);
- return 0;
- }
另一种方法不用离线,我们用数组last记录每个位置上该颜色上次出现的位置(第一次出现记0),然后询问每个区间内,有多少个点i满足last[i] < l;但是这个东西怎么维护呢?我想想……我晓得了,是主席树!\(OwO)/ 以后再打吧。
【P1972】HH的项链——树状数组+询问离线的更多相关文章
- 【题解】P1972 [SDOI2009]HH的项链 - 树状数组
P1972 [SDOI2009]HH的项链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 \(HH\) 有一串由各种 ...
- luogu P1972 [SDOI2009]HH的项链 |树状数组 或 莫队
题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
- 洛谷 P1972 [SDOI2009]HH的项链——树状数组
先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...
- [BZOJ1878] [SDOI2009] HH的项链 (树状数组)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- 【bzoj1878】[SDOI2009]HH的项链 树状数组
题目描述 HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变得越来越长.有一 ...
- [SDOI2009]HH的项链 树状数组 BZOJ 1878
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- BZOJ1878: [SDOI2009]HH的项链[树状数组 离线]
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3486 Solved: 1738[Submit][Statu ...
- luogu1972 HH的项链(树状数组)
无修改.询问区间种类数的问题可以很容易地用树状数组解决 我们先给询问按右端点排序,然后推着做,每次让a[i]++,表示i处新增了一个种类 但是这样会和前面的有重复,我们只要记下每个种类上次在哪里出现过 ...
随机推荐
- 01 . Go之Gin+Vue开发一个线上外卖应用
项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...
- SpringCloud gateway 过滤
如果需要获取一张图片但服务器没有过滤图片请求地址时,每次请求图片都需要携带token等安全验证密钥,可到nacos配置网关(gateway)的security配置,可过滤掉你配置的url(可理解为白名 ...
- 题解 P1541 【乌龟棋】
题目描述 乌龟棋的棋盘是一行\(N\)个格子,每个格子上一个分数(非负整数).棋盘第\(1\)格是唯一的起点,第\(N\)格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中\(M\) ...
- JavaSE基础语法学习
标识符 表示类名的标识符用大写字母开始. 表示方法和变量的标识符用小写字母开始,后面的描述性词以大写开始. 注意 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($).或者下划线(_)开始 ...
- 2.1 自定义日志系统-log4net
说明 Prism中如果把日志级别设定为DEBUG,会显示框架加载信息 Prism默认是没有日志系统的 步骤 下载log4net包 Install-Package log4net; 在app.confi ...
- Shell 筛选符合条件的 ELF 文件
0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 引言 - 编译过程 我们知道在 CPU 上执行的是低级别的机 ...
- 卡特兰数 洛谷P1641 [SCOI2010]生成字符串
卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...
- Mycat分库分表(一)
随着业务变得越来越复杂,用户越来越多,集中式的架构性能会出现巨大的问题,比如系统会越来越慢,而且时不时会宕机,所以必须要解决高性能和可用性的问题.这个时候数据库的优化就显得尤为重要,在说优化方案前,先 ...
- SpringBoot第十集:i18n与Webjars的应用(2020最新最易懂)
SpringBoot第十集:i18n与Webjars的应用(2020最新最易懂) 一,页面国际化 i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符 ...
- tcp 接收被动关闭 fin
void tcp_rcv_established(struct sock *sk, struct sk_buff *skb, const struct tcphdr *th, unsigned int ...