主席树-----动态开点,不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 ...
随机推荐
- HTML5之FileReader的使用.RP
HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简 ...
- C++文件流打开标识符.RP
ofstream流,以ios::app打开(或者“ios::app|ios::out”),如果没有文件,那么生成空文件:如果有文件,那么在文件尾追加.以ios::app|ios::in打开,不管有没有 ...
- Mysql--基本配置
登录的常用参数 mysql -uroot -p 之后再加上密码 mysql -uroot -p+密码 这个方法不安全 mysql -hlocalhost -uroot -p 之后再加上密码 ...
- [学习记录]fork压力测试程序
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> ...
- Servlet对象生命周期(四)
一.Servlet对象生命周期 一下图片说明上图第7点 destroy()方法是在停止tomcat服务器时执行 https://pan.baidu.com/s/1mgTabWW#list/path=% ...
- PyCharm中的Console调整字体大小
file-->settings-->Editor-->color Scheme-->Console Font --> size 调整大小
- Summer Holiday 强连通
Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity i ...
- 网络模拟工具Clumsy
Clumsy 是一款小巧而功能强大的开源弱网模拟工具,它能在windows平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现. 你可以选择 clumsy 提供的功能来有目的性的调 ...
- json解析(自动判断是jsonArray和jsonObject)
因为想做一个接口自动化框架,已经实现了接口的访问和连接及获取接口返回的json数据,但json数据的解析是个麻烦的事情,所以写一个简单的版本记录一下.后续会进行优化,实现方法分离以及自动识别循环解析返 ...
- Berkeley DB 使用经验总结
作者:陈磊 NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列.最近使用BDB来发 ...