主席树-----动态开点,不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 ...
随机推荐
- CodeForces 141C Queue (构造)
题意:n 个人在排队,然后给出每个人的前面比他身高高的人的数量hi,让你给出一种排列,并给出一种解. 析:首先,hi 小的要在前面,所以先进行排序,然后第一个人的 h1 必须为0,我们可以令身高为 1 ...
- CodeForces 404C Restore Graph (构造)
题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久 ...
- HDU 5038 Grade (水题,坑题)
题意:给 n 个数,输出众数,但是如果所有的频率都相同但数不同输出 Bad Mushroom. 析:直接记录个数直接暴力就,就是要注意只有一种频率的时候. 代码如下: #pragma comment( ...
- CodeForces - 710C Magic Odd Square(奇数和幻方构造)
Magic Odd Square Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, c ...
- web.xml 注册中央调度器Url-pattern 要注意的地方(五)
一.url-pattern 里面不能用/* 二.最好不要写成杠,如果使用“/”,中央调度器会把静态资源拦截掉,比如图片会不显示,或者css不能用. 但,如果地址栏传参数的时候比如是/del ...
- 对bookinfo.dat的说明
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03 现在论坛推出的下载工具五花八门,但是有不少都忽视了bookinfo.dat的生成,因此有必要说明一下这个 ...
- c语言判断是否是utf8字符串,计算字符个数
#include <stdio.h> #include <string.h> #include <stdlib.h> /********************** ...
- 对Dapper的一点改造
微软推出的ORM, EF在我开发的项目中给我的感觉一直都是慢.优点是高度封装的底层.便于开发. Dapper在多篇性能比较的网站中.都是名列前三.缺点是手写SQL,不便于开发. 如果能结合EF的优 ...
- docker网络模式----入门docker的难点
众所周知,现在docker是轻量级虚拟化的典型代表!这段时间想要建立一个分布式系统,但是手头上主机没那么多,所以使用docker进行虚拟化,但是在使用的过程中对网络这一部分是一直不太理解,特别找了一篇 ...
- 控制某个panel的display样式
"我想在onload方法里把panel的 style 里的 display 属性变成 none.我的页面由于有一些脚本,触发某些事件之后还想显示这个panel,不想用Panel3.Visib ...