主席树-----动态开点,不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(28):Concurrency
Concurrency in Entity Framework: Entity Framework supports Optimistic Concurrency by default. In the ...
- Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩
这段时间,抽空研究了一下Ubuntu,虽然也有过到目前为止使用计算机最作死的经历,但目前已经学会了一些最基本的操作.在这里简单的记录一下,算是吸取的教训,供其他人借鉴. 1.装Ubuntu系统.装Ub ...
- Cookie seesion 赋值
后台赋值: Session["uid"] = userid;//后台 后台取值: Label1.Text = Session["userid"].ToStrin ...
- C#中的多线程 - 高级多线程
1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也需要同步.尽管锁总能满足这个需求,一个存在竞争的锁意味着肯定有线程会被阻塞,就会导致由上下文切换和调度的延迟带来的开销 ...
- CefSharp49.0.1 SetZoomLevel
SetZoomLevel(double zoomLevel) -8<= zoomLevel <=9 Each zoom level increases the zoom by 20%. ...
- 【京东助手】滑稽东试用助手 V1.6.0
很久没写博客了,发个最近在做的一个软件! 滑稽东试用助手现有功能1.自动申请试用2.自动领取京豆3.自动签到领取京豆说明:该软件使用C#开发,若要运行此应用程序,您必须首先安装 .NET4.01.双击 ...
- mybatis新增对象自动生成uuid方案
mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写 ...
- docker常用命令行集锦
对工作中用到的docker命令行进行一个汇总,方便以后的命令行查询,同时也为了加强记忆,会把工作中用到的命令,持续更新上 1.查看私有仓库都有哪些镜像 curl -X GET http://10.27 ...
- UGUI 深度優化提升手遊效能
https://hackmd.io/s/S1z1ByaGb#UGUI-%E6%B7%B1%E5%BA%A6%E5%84%AA%E5%8C%96%E6%8F%90%E5%8D%87%E6%89%8B%E ...
- luogu p4174 最大获利(最大权闭合子图)
luogu p4174 最大获利(最大权闭合子图) 给定n个点,m条边,每条边有一个贡献,每个点有一个代价.选择一条边,会付出边所连两个点的代价,问最大代价. 我们换个建图方式:把图G中的边\(e_i ...