大家好,我是个毒瘤,我非常喜欢暴力数据结构,于是我就用莫队+分块过了这个题

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(主席树)的更多相关文章

  1. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  2. P3919 【模板】可持久化数组 -初步探究主席树

    本篇blog主要是给自己(大家)看的. 感谢longlongzhu123奆佬(此人初二LCT)的指点,使本蒟蒻可以快速开始主席树入门. what is 主席树? $        $主席树这个名字只不 ...

  3. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  4. BZOJ1878[SDOI2009]HH的项链+莫队算法模板

    题意:多次询问,求在一个区间中,有多少种珠子: 思路:莫队算法模板题目: 参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html #inclu ...

  5. POJ 2104 K-th Number(分桶,线段树,主席树)

    一道比较经典的数据结构题.可以用多种方式来做. 一,分桶法(平方分解). 根据数字x的大小和区间内不大于x的数字数量cnt的单调性,可知第k大数kth对应的cnt应该满足cnt≥k, 且kth是满足条 ...

  6. 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)

    [题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...

  7. 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 ...

  8. 【BZOJ4771】七彩树(主席树)

    [BZOJ4771]七彩树(主席树) 题面 BZOJ 题解 如果没有深度限制,每次只询问子树内的颜色个数,除了树套树\(dfs\)序加前驱或者后继强行二维数点之外,还有这样一种做法: 把所有相同颜色的 ...

  9. 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

    正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...

  10. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

随机推荐

  1. 转 gerrit

    开发环境 https://blog.csdn.net/u013207966/article/details/79112740 先记录下我的开发环境以及要正确安装gerrit需要用到的工具: Redha ...

  2. Unity3D:Text在Inspector面板中中无法显示,需转换成UTF-8格式

    环境:Win10 读取text内容后unity报错:Input string was not in the correct format 同时在Inspector面板中无法预览Text文本内容 随后发 ...

  3. Spring单元测试集成H2数据库

    项目源代码在:Spring-H2测试 H2简介 H2数据库是一种由Java编写的,极小,速度极快,可嵌入式的数据库.非常适合用在单元测试等数据不需要保存的场景下面. 以下时其官网的介绍: {% blo ...

  4. Redis5.0:在这些场景使用,高效率还低成本!

    很多大型电商网站.视频直播和游戏应用等,存在大规模数据访问,对数据查询效率要求高,且数据结构简单,不涉及太多关联查询. 这种场景使用Redis,在速度上对传统磁盘数据库有很大优势,能够有效减少数据库磁 ...

  5. 从无到有之webpack+vuerouter的简单例子以及各个属性解释

    之前一直没玩过webpack和vue,近两周才看这玩意,本文纯属自己的实验+之前angular作战经验的理解一些入门文章 首先webpack关于vue以及各个包 module.exports = { ...

  6. $_SERVER的详细参数整理下

    PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行 脚本的文件名,与 document roo ...

  7. Scrum立会报告+燃尽图(十一月十五日总第二十三次):代码规范与技术交流

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 项目地址:https://git.coding.net/zhang ...

  8. 细节--服务器mysql空密码

    在部署致服务器的时候 发现mysql密码为空的情况 如果采用 root账户的话 试过很多 比如不写下面这行 <property name="password" value=& ...

  9. linshi12

    #include<iostream> using namespace std; int main(){ int a[50]; a[1]=5; int i; for(i=2;;i++){ a ...

  10. 周总结<4>

    经过了一周的学习,我们在html以及C语言方面又有的新的知识点的学习. html 自习表格,函数等 C语言 哈弗曼编码 Html案例: 一. <!DOCTYPE html PUBLIC &quo ...