【莫队】【P3834】 【模板】可持久化线段树 1(主席树)
大家好,我是个毒瘤,我非常喜欢暴力数据结构,于是我就用莫队+分块过了这个题
Solution
发现这个题静态查询资瓷离线,于是考虑莫队。
在这里简单介绍一下莫队:
将所有询问离线后,对原序列分块。按照左端点所在块单调不降排序。当左端点所在块相同时,按照右端点单调排序。
然后用头尾指针指向当前的区间,维护区间内的信息。每两个查询间暴力移动指针。移动指针时每移动一下就维护一次答案。
考虑这么做的复杂度:一共有 \(O(\sqrt{n})\)个块,每个块内右端点单调,所以一个块内右端点最多移移动 \(O(n)\) 个位置,于是右端点移动 \(O(n~\sqrt{n})\)个位置。同理,左端点在一个块内最多移动 \(O(\sqrt{n})\) 次,每次最多移动 \(O(\sqrt{n})\) 个位置,块内移动次数是 \(O(n)\) 。一共有 \(O(\sqrt{n})\) 个块,于是左端点移动 \(O(n~\sqrt{n})\) 个位置。于是莫队不计修改和查询的总复杂度为 \(O(n~\sqrt{n})\)。
维护答案时,最显然的想法是用树状数组维护前缀和,这样单次修改复杂度 \(O(\log n)\) ,查询时在树状数组上二分,复杂度 \(O(\log n)\) 。修改总复杂度 \(O(n~\sqrt{n}~\log n)\) ,查询的总复杂度 \(O(m~\log n)\) 。于是发现修改的复杂度过高,查询的复杂度完全不需要这么低,那么可以用分块将修改复杂度将至 \(O(1)\) ,查询复杂度升高至 \(O(\sqrt{n})\) 。具体的,离散化后按照权值分块,每个块维护块内元素出现总次数。查询时暴力从第一个块开始扫,累加元素出现总次数,当加入一个块总次数大于 \(k\) 时在块内暴力找位置,总复杂度 \(O(n~\sqrt n)\)。开O2最慢的点250ms
Code
#include <cmath>
#include <cstdio>
#include <algorithm>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endif
#define rg register
#define ci const int
#define cl const long long
typedef long long int ll;
namespace IPT {
const int L = 10000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
}
template <typename T>
inline void qr(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
}
template <typename T>
inline void ReadDb(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch = IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = x * 10 + (ch ^ 48), ch = IPT::GetChar();
if (ch == '.') {
ch = IPT::GetChar();
double base = 1;
while ((ch >= '0') && (ch <= '9')) x += (ch ^ 48) * ((base *= 0.1)), ch = IPT::GetChar();
}
if (lst == '-') x = -x;
}
namespace OPT {
char buf[120];
}
template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
rg int top=0;
do {OPT::buf[++top] = x % 10 + '0';} while ( x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
}
const int maxn = 200010;
int n, m;
int belong[maxn], MU[maxn], temp[maxn], bk[maxn], block[maxn], rmp[maxn], lc[maxn];
struct Ask {
int l, r, id, ans, k;
inline bool operator<(const Ask &_others) const {
if (belong[this->l] != belong[_others.l]) return this->l < _others.l;
if (belong[this->l] & 1) return this->r < _others.r;
return this->r > _others.r;
}
};
Ask ask[maxn];
void init_hash();
void add(ci&);
void dlt(ci&);
inline bool cmp(const Ask &_a,const Ask &_b) {
return _a.id < _b.id;
}
int main() {
freopen("1.in", "r", stdin) ;
qr(n); qr(m);
for (rg int i = 1, sn = sqrt(n); i <= n; ++i) if((belong[i] = i / sn) != belong[i-1]) lc[belong[i]] = i;
for (rg int i = 1; i <= n; ++i) qr(MU[i]);
init_hash();
for (rg int i = 1; i <= m; ++i) {
qr(ask[i].l); qr(ask[i].r); qr(ask[i].k); ask[i].id = i;
}
std::sort(ask + 1, ask + 1 + m);
int prel = ask[1].l, prer = prel - 1;
for (rg int i = 1; i <= m; ++i) {
int l = ask[i].l, r = ask[i].r;
while (prel < l) dlt(prel++);
while (prel > l) add(--prel);
while (prer > r) dlt(prer--);
while (prer < r) add(++prer);
int _cnt = 0, cur = 0;
while (_cnt + block[cur] < ask[i].k) _cnt+=block[cur++];
for (rg int j = lc[cur]; ; ++j) if((_cnt += bk[j]) >= ask[i].k) {
ask[i].ans = j; break;
}
}
std::sort(ask + 1, ask + 1 + m, cmp);
for (rg int i = 1; i <= m; ++i) qw(rmp[ask[i].ans], '\n', true);
return 0;
}
void init_hash() {
for (rg int i = 1; i <= n; ++i) temp[i] = MU[i];
std::sort(temp + 1, temp + 1 + n);
int *ed = std::unique(temp + 1, temp + 1 + n);
for (rg inti = 1; i <= n; ++i) {
int k = MU[i];
rmp[MU[i] = std::lower_bound(temp + 1, ed, MU[i]) - temp] = k;
}
}
inline void dlt(ci &k) {
--bk[MU[k]];
--block[belong[MU[k]]];
}
inline void add(ci &k) {
++bk[MU[k]];
++block[belong[MU[k]]];
}
Summary
我爱暴力数据结构!
【莫队】【P3834】 【模板】可持久化线段树 1(主席树)的更多相关文章
- 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...
- P3919 【模板】可持久化数组 -初步探究主席树
本篇blog主要是给自己(大家)看的. 感谢longlongzhu123奆佬(此人初二LCT)的指点,使本蒟蒻可以快速开始主席树入门. what is 主席树? $ $主席树这个名字只不 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- BZOJ1878[SDOI2009]HH的项链+莫队算法模板
题意:多次询问,求在一个区间中,有多少种珠子: 思路:莫队算法模板题目: 参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html #inclu ...
- POJ 2104 K-th Number(分桶,线段树,主席树)
一道比较经典的数据结构题.可以用多种方式来做. 一,分桶法(平方分解). 根据数字x的大小和区间内不大于x的数字数量cnt的单调性,可知第k大数kth对应的cnt应该满足cnt≥k, 且kth是满足条 ...
- 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
[题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...
- poj 2104 K-th Number 划分树,主席树讲解
K-th Number Input The first line of the input file contains n --- the size of the array, and m --- t ...
- 【BZOJ4771】七彩树(主席树)
[BZOJ4771]七彩树(主席树) 题面 BZOJ 题解 如果没有深度限制,每次只询问子树内的颜色个数,除了树套树\(dfs\)序加前驱或者后继强行二维数点之外,还有这样一种做法: 把所有相同颜色的 ...
- 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治
正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...
- BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...
随机推荐
- katalon系列十三:5.10新增跳过用例&命令行赋值全局变量
Katalon Studio升级到5.10版本了,这次新增了2个很实用的功能:一.跳过用例在Listener中新增了跳过用例方法,Listener类似于JUnit4的annotation中的@Befo ...
- angular之$broadcast、$emit、$on传值
文件层级 index.html <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta ...
- html js div随鼠标移动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- NO.2:自学python之路------变量类型、列表、字典
引言 本周初步认识了库,并学习了Python中各种类型的变量和常用操作.并完成了较为完善的用户与商家购物界面设计. 正文 模块: Python有标准库和第三方库.第三方库需要安装才能使用.大量的库可以 ...
- 自然语言处理 - 如何通俗地理解TFIDF?
本博客属个人学习笔记,如有疏漏,欢迎在评论留言指出~转载请注明. 在自然语言处理中,TFIDF常常被人提及.很多材料都提及TFIDF中的“普遍重要性”,但很少有材料去简单解释其中的原理.TFIDF其实 ...
- [T-ARA][Falling U]
歌词来源:http://music.163.com/#/song?id=27506041 作词:韩尚元 [作词:韩尚元] 作曲:韩尚元 [作曲:韩尚元] Love is pain Love is pa ...
- Python Requests库入门——应用实例-京东商品页面爬取+模拟浏览器爬取信息
京东商品页面爬取 选择了一款荣耀手机的页面(给华为打广告了,荣耀play真心不错) import requests url = "https://item.jd.com/7479912.ht ...
- 定制自己的动画 View 控件(Canvas 使用)
定制自己的动画 View 控件(Canvas 使用) 如果要定义自己的 View 控件,则需要新建一个类继承 android.view.View.然后在 onDraw 中写自己需要实现的方式. 这里定 ...
- unknown2
结对作业 本次结对:211606457 郑沐榕.211406242 杨长元 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时( ...
- 基础系列(6)—— C#类和对象
一.类介绍 类(class)是C#类型中最基础的类型.类是一个数据结构,将状态(字段)和行为(方法和其他函数成员)组合在一个单元中.类提供了用于动态创建类实例的定义,也就是对象(objec ...