POJ - 2104

第k大

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;const int maxn = 100000 + 20;struct Node {int L, R;int sum;
} seg[maxn << 5];int T[maxn];int tot;int build(int L, int R) {int root = ++tot;seg[root].sum = 0;if (L < R) {int mid = (L + R) >> 1;seg[root].L = build(L, mid);seg[root].R = build(mid + 1, 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 + 1;if (L < R) {int mid = (L + R) >> 1;if (val <= mid) seg[root].L = upDate(seg[version].L, L, mid, val);else seg[root].R = upDate(seg[version].R, mid + 1, 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) >> 1;if (num >= k) {return query(seg[u].L, seg[v].L, L, mid, k);} else return query(seg[u].R, seg[v].R, mid + 1, R, k - num);
}int a[maxn];
vector<int> vc;int getID(int val) {return lower_bound(vc.begin(), vc.end(), val) - vc.begin() + 1;
}const int down = -1e9, up = 1e9;void work() {tot = 0;vc.clear();int n, m;cin >> n >> m;for (int i = 1; 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[0] = build(up, down);for (int i = 1; i <= n; ++i) {
//        int id = getID(a[i]);T[i] = upDate(T[i - 1], down, up, a[i]);}for (int i = 1; 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 - 1], T[R], down, up, val);printf("%d\n", res);}}int main() {#ifdef localfreopen("data.txt", "r", stdin);#endif // local
//    int t;
//    scanf("%d", &t);
//    while (t--) work();
    work();return 0;
}

View Code

区间不同元素个数

https://vjudge.net/problem/SPOJ-DQUERY

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;const int maxn = 300000 + 20;struct Node {int L, R;int sum;
} seg[maxn << 5];
int T[maxn], now;int build(int L, int R) {++now;seg[now].sum = 0;if (L < R) {int mid = (L + R) >> 1;seg[now].L = build(L, mid);seg[now].R = build(mid + 1, 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) >> 1;if (val <= mid) {seg[root].L = upDate(seg[version].L, L, mid, val, xo);} else {seg[root].R = upDate(seg[version].R, mid + 1, R, val, xo);}}return root;
}int query(int version1, int version2, int L, int R, int be, int en) {if (L > R) return 0;if (L >= be && R <= en) {return seg[version2].sum - seg[version1].sum;}int ans = 0;int mid = (L + R) >> 1;if (mid >= be) ans += query(seg[version1].L, seg[version2].L, L, mid, be, en);if (mid + 1 <= en) ans += query(seg[version1].R, seg[version2].R, mid + 1, R, be, en);return ans;
}int pre[1000000 + 2];int up = -1e9;
int en = 1e9;void work() {int n;scanf("%d", &n);for (int i = 1; i <= n; ++i) {int x;scanf("%d", &x);if (pre[x]) {int res = upDate(T[i - 1], up, en, pre[x], -1);T[i] = upDate(res, up, en, i, 1);} else T[i] = upDate(T[i - 1], up, en, i, 1);pre[x] = i;}int q;cin >> q;while (q--) {int l, r;scanf("%d%d", &l, &r);printf("%d\n", query(T[l - 1], T[r], up, en, l, r));}
}int main() {
#ifdef localfreopen("data.txt", "r", stdin);
#endif // localwork();return 0;
}

View Code

转载于:https://www.cnblogs.com/liuweimingcprogram/p/8849471.html

主席树-----动态开点,不hash相关推荐

  1. ZOJ 2112 Dynamic Rankings(主席树-动态第k大)

    Description 给出一个长度为n的序列a,两种操作 C x v:将第x个元素的值改成v Q l r k:查询区间[l,r]中第k大的元素 Input 第一行为一个整数t表示用例组数,每组用例第 ...

  2. HDU - 6183 暴力,线段树动态开点,cdq分治

    B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...

  3. 线段树动态开点区间加区间求和

    线段树动态开点区间加区间求和 题目来源: 陕西师范大学第七届程序设计竞赛网络同步赛 H. 万恶的柯怡 思想: 保证叶子节点被完整的覆盖,需要开节点,就把左右儿子都开出来,其余和普通线段树一样. tip ...

  4. ZYH的斐波那契数列【线段树动态开点+矩阵快速幂求斐波那契】

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  5. 【题解】有便便的厕所(权值线段树动态开点模板题)

    我只是来填坑的. 关于权值线段树的更多有关内容见此. 题面 题目描述 众所周知, GM \texttt{GM} GM 家的狗特别喜欢拉便便. GM \texttt{GM} GM 为了方便它方便,在家里 ...

  6. BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)

    传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...

  7. Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

    传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...

  8. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  9. HDU - 5709 Claris Loves Painting 线段树动态开点+合并

    题目链接:https://cn.vjudge.net/problem/HDU-5709 题意:给定一棵n点的树,每个节点上有一个颜色,每次询问一个点的子树中与这个点距离不超过d的点的颜色有多少种 题解 ...

  10. 线段树动态开点 - - - > 线段树合并

    逆序对 代码 P3224 [HNOI2012]永无乡 并查集+线段树合并       ​​​​ 代码 P5494 [模板]线段树分裂 #include<iostream> #include ...

最新文章

  1. 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
  2. 在Ubuntu17.04中遇到无法清空回收站解决方法
  3. 黄聪:DEDECMS织梦系统共如何添加自定义属性和修改方法
  4. 回调函数案列(C高级)
  5. ALAssetsLibrary获取相册列表
  6. 另一种无法enable ABAP source code tool的原因
  7. Html5做webapp中界面适配的问题总结
  8. 封装EF code first用存储过程的分页方法
  9. python归并排序算法实现_python算法实现系列-归并排序
  10. 视觉SLAM笔记(42) 光流法跟踪特征点
  11. android 4.2版本的sdcard文件目录分析
  12. 读书笔记——数据压缩入门(柯尔特·麦克安利斯)下
  13. pycharm关联python ide_Python+Selenium进阶版 (一)- Python IDE工具-PyCharm的安装和使用...
  14. oracle 空间数据库说明
  15. android serviceconnection unbind流程,Android Service 再次 unbindSrvice 时的问题
  16. 等保三级全称是什么?是什么意思?
  17. 巨人网络18年春招java答案_巨人网络18春招Java开发笔试题,希望对大家能有帮助...
  18. Mockito开发指南
  19. Python学习DAY5|数据分析简介与实战
  20. python爬取音乐并保存的格式_python爬取QQ音乐歌单歌曲保存到本地,json解析

热门文章

  1. P.Laguna / AUTOMATIC DETECTION OF WAVE BOUNDARIES IN MULTILEAD ECG SIGNALS VALIDATION WITH THE CSE
  2. java itext 横线,Java itext生成pdf设置下划线,,package cn.o
  3. oracle添加字段sql_如何用SQL语句添加和修改字段?
  4. Ubuntu18.04 安装 nvidia2080Ti显卡驱动
  5. 【数据库系统原理】实体-联系模型
  6. kafka 查看消费者组
  7. scala =>用法总结
  8. c++反转字符,算法优化与实现
  9. MFC调用dos窗口使用printf,cout打印输出
  10. 【mybatis】 mybatis在mysql 更新update 操作 更新时间字段按照年月日时分秒格式 更新为当前时间...