主席树-----动态开点,不hash
第k大
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath> #include <vector>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = + ; struct Node {
int L, R;
int sum;
} seg[maxn << ]; int T[maxn]; int tot; int build(int L, int R) {
int root = ++tot;
seg[root].sum = ;
if (L < R) {
int mid = (L + R) >> ;
seg[root].L = build(L, mid);
seg[root].R = build(mid + , R);
}
return root;
} int upDate(int version, int L, int R, int val) {
int root = ++tot;
seg[root] = seg[version];
seg[root].sum = seg[version].sum + ;
if (L < R) {
int mid = (L + R) >> ;
if (val <= mid) seg[root].L = upDate(seg[version].L, L, mid, val);
else seg[root].R = upDate(seg[version].R, mid + , R, val);
}
return root;
} int query(int u, int v, int L, int R, int k) {
if (L >= R) return L;
int num = seg[seg[v].L].sum - seg[seg[u].L].sum;
int mid = (L + R) >> ;
if (num >= k) {
return query(seg[u].L, seg[v].L, L, mid, k);
} else return query(seg[u].R, seg[v].R, mid + , R, k - num);
} int a[maxn];
vector<int> vc; int getID(int val) {
return lower_bound(vc.begin(), vc.end(), val) - vc.begin() + ;
} const int down = -1e9, up = 1e9; void work() {
tot = ;
vc.clear();
int n, m;
cin >> n >> m;
for (int i = ; i <= n; ++i) {
scanf("%d", a + i);
vc.push_back(a[i]);
}
sort(vc.begin(), vc.end());
vc.erase(unique(vc.begin(), vc.end()), vc.end());
// for (int i = 0; i < vc.size(); ++i) {
// printf("%d ", vc[i]);
// }
T[] = build(up, down);
for (int i = ; i <= n; ++i) {
// int id = getID(a[i]);
T[i] = upDate(T[i - ], down, up, a[i]);
}
for (int i = ; i <= m; ++i) {
int L, R, val;
scanf("%d%d%d", &L, &R, &val);
// val = (R - L + 1) - val + 1;
int res = query(T[L - ], T[R], down, up, val);
printf("%d\n", res);
} } int main() {
#ifdef local
freopen("data.txt", "r", stdin);
#endif // local
// int t;
// scanf("%d", &t);
// while (t--) work();
work();
return ;
}
区间不同元素个数
https://vjudge.net/problem/SPOJ-DQUERY
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f; const int maxn = + ; struct Node {
int L, R;
int sum;
} seg[maxn << ];
int T[maxn], now; int build(int L, int R) {
++now;
seg[now].sum = ;
if (L < R) {
int mid = (L + R) >> ;
seg[now].L = build(L, mid);
seg[now].R = build(mid + , R);
}
return now;
} int upDate(int version, int L, int R, int val, int xo) {
int root = ++now;
seg[root] = seg[version];
seg[root].sum = seg[version].sum + xo;
if (L < R) {
int mid = (L + R) >> ;
if (val <= mid) {
seg[root].L = upDate(seg[version].L, L, mid, val, xo);
} else {
seg[root].R = upDate(seg[version].R, mid + , R, val, xo);
}
}
return root;
} int query(int version1, int version2, int L, int R, int be, int en) {
if (L > R) return ;
if (L >= be && R <= en) {
return seg[version2].sum - seg[version1].sum;
}
int ans = ;
int mid = (L + R) >> ;
if (mid >= be) ans += query(seg[version1].L, seg[version2].L, L, mid, be, en);
if (mid + <= en) ans += query(seg[version1].R, seg[version2].R, mid + , R, be, en);
return ans;
} int pre[ + ]; int up = -1e9;
int en = 1e9; void work() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
int x;
scanf("%d", &x);
if (pre[x]) {
int res = upDate(T[i - ], up, en, pre[x], -);
T[i] = upDate(res, up, en, i, );
} else T[i] = upDate(T[i - ], up, en, i, );
pre[x] = i;
}
int q;
cin >> q;
while (q--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", query(T[l - ], T[r], up, en, l, r));
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
#endif // local
work();
return ;
}
主席树-----动态开点,不hash的更多相关文章
- 主席树--动态区间第k小
主席树--动态区间第\(k\)小 模板题在这里洛谷2617. 先对几个问题做一个总结: 阅读本文需要有主席树的基础,也就是通过区间kth的模板题. 静态整体kth: sort一下找第k小,时间复杂度\ ...
- BZOJ_4636_蒟蒻的数列_线段树+动态开点
BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...
- hdu6183 Color it 线段树动态开点+查询减枝
题目传送门 题目大意: 有多次操作.操作0是清空二维平面的点,操作1是往二维平面(x,y)上放一个颜色为c的点,操作2是查询一个贴着y轴的矩形内有几种颜色的点,操作3退出程序. 思路: 由于查询的矩形 ...
- P3939 数颜色 线段树动态开点
P3939 数颜色 线段树动态开点 luogu P3939 水.直接对每种颜色开个权值线段树即可,注意动态开点. #include <cstdio> #include <algori ...
- HDU - 6183 暴力,线段树动态开点,cdq分治
B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...
- 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点
题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...
- codedecision P1113 同颜色询问 题解 线段树动态开点
题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- ZOJ 2112 Dynamic Rankings(主席树の动态kth)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings ...
随机推荐
- Entity Framework Tutorial Basics(16):Linq-to-Entities Projection Queries
Linq-to-Entities Projection Queries: Here, you will learn how to write LINQ-to-Entities queries and ...
- DWR原理探秘
DWR原理探秘 DWR(Direct Web Remoting)远程Web命令;是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可 ...
- mysql双机热备份的实现步骤
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾.备份.恢复.负载均衡等都是有极大帮助的.本文描述了常见的同步设置方法.<?xml:namespace prefix = o /> ...
- Java代码执行机制
一.java源码编译机制 一个java文件编译为.class文件的流程图. Parse an Enter阶段: Parse:将代码字符串转换为token序列(com.sun.tools.javac.p ...
- 《Linux内核设计与实现》读书笔记(六)- 内核数据结构
内核数据结构贯穿于整个内核代码中,这里介绍4个基本的内核数据结构. 利用这4个基本的数据结构,可以在编写内核代码时节约大量时间. 主要内容: 链表 队列 映射 红黑树 1. 链表 链表是linux内核 ...
- DjVu转PDG的方法与步骤
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03更新:2008.08.24 补充说明:此文成文较早,当时PDG浏览器只支持纯正PDG,不支持名为PDG,实 ...
- Copy拷贝
前言 copy:需要先实现 NSCopying 协议,创建的是不可变副本. mutableCopy:需要实现 NSMutableCopying 协议,创建的是可变副本. 浅拷贝:指针拷贝,源对象和副本 ...
- sort排序bug乱序
项目需要对组件的zIndex值进行降序排列,刚开始采用的是sort进行排序,排完之后感觉没问题,毕竟也是经常用的,可是昨天无意中把zIndex值打出来看,一看不知道,发现只要排序的组件超过10个就出问 ...
- Hyper-V 配置虚拟机内网及外网环境
一.为Hyper-V虚拟机准备内外网环境 1.内网环境——虚拟机与虚拟机及主机可以互通
- P2156 [SDOI2009]细胞探索
$ \color{#0066ff}{ 题目描述 }$ 生物课上,老师开始为同学们介绍细胞.为了加深同学们的印象,老师在一张N×M的矩阵中定义了一种细胞,矩阵中仅有井号"#"和点&q ...