博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1878 HH的项链 | 主席树
阅读量:5126 次
发布时间:2019-06-13

本文共 1850 字,大约阅读时间需要 6 分钟。

题意

询问区间有多少不同的数。

题解

和一样,这道题也是用pre数组来求区间不同数的个数,这里pre[i]表示a[i]上一次出现的位置 +1,询问相当于查询区间内有多少pre小于等于左端点。

#include 
#include
#include
#include
using namespace std;typedef long long ll;#define space putchar(' ')#define enter putchar('\n')template
void read(T &x){ char c; bool op = 0; while(c = getchar(), c < '0' || c > '9') if(c == '-') op = 1; x = c - '0'; while(c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op) x = -x;}template
void write(T x){ if(x < 0) x = -x, putchar('-'); if(x >= 10) write(x / 10); putchar('0' + x % 10);}const int N = 50005;int n, m, l, r, ans, a[N], last[1000005], pre[N];int idx, ls[N*50], rs[N*50], data[N*50], root[N];void build(int &k, int l, int r){ k = ++idx; if(l == r) return; int mid = (l + r) >> 1; build(ls[k], l, mid); build(rs[k], mid + 1, r);}void change(int old, int &k, int l, int r, int p, int x){ k = ++idx; ls[k] = ls[old], rs[k] = rs[old], data[k] = data[old]; if(l == r) return (void)(data[k] += x); int mid = (l + r) >> 1; if(p <= mid) change(ls[old], ls[k], l, mid, p, x); else change(rs[old], rs[k], mid + 1, r, p, x); data[k] = data[ls[k]] + data[rs[k]];}int query(int old, int k, int l, int r, int ql, int qr){ if(ql <= l && qr >= r) return data[k] - data[old]; int mid = (l + r) >> 1, ret = 0; if(ql <= mid) ret += query(ls[old], ls[k], l, mid, ql, qr); if(qr > mid) ret += query(rs[old], rs[k], mid + 1, r, ql, qr); return ret;}int main(){ read(n); build(root[0], 1, n); for(int i = 1; i <= n; i++){ read(a[i]); pre[i] = last[a[i]] + 1; last[a[i]] = i; change(root[i - 1], root[i], 1, n, pre[i], 1); } read(m); while(m--){ read(l), read(r); write(query(root[l - 1], root[r], 1, n, 1, l)), enter; } return 0;}

转载于:https://www.cnblogs.com/RabbitHu/p/BZOJ1878.html

你可能感兴趣的文章
Java概览(java语言编程艺术笔记)
查看>>
Laravel框架一:原理机制篇
查看>>
链表题目汇总(python3)
查看>>
Vijos——T 1629 八
查看>>
MySQL 表和列的注释
查看>>
linux shell if
查看>>
优秀的Android资源
查看>>
gdb调试
查看>>
数论考试题(b) 求约数的约数的最大个数
查看>>
tcp/ip协议
查看>>
python函数-基础知识
查看>>
BFS HDOJ 1242 Rescue
查看>>
oppo手机使用应用沙盒动态修改硬件数据
查看>>
MySQL学习(三)
查看>>
HTML 快递打印模板
查看>>
02使用常规步骤编译NanoPiM1Plus的Android4.4.2
查看>>
柯理化
查看>>
linux rz批量上传
查看>>
River Hopscotch-[二分查找、贪心]
查看>>
[翻译]SQL Server 未公开的两个存储过程sp_MSforeachtable 和 sp_MSforeachdb
查看>>