题目链接  数列查找

考虑分块然后跑莫队,

设$c[i]$为$i$在当前维护的区间内出现的次数,

$g[i]$为在当前维护的区间内有多少个数出现次数为$i$,

$bg[i]$把出现次数分块,$bg[i]$的意义是第$i$个块代表的所有出现次数中出现的个数。

$f[i][j]$对$1$到$n$分块,意义为当前在第$j$个数字块中有多少个数出现次数为$i$。

每一次询问的时候,我们先求出当前要求的出现次数是多少。

这个通过$bg[]$来求。

然后再根据$f[][]$确定当前区间中出现$k1$次的所有数中第$k2$小的数。

为了方便我用了离散化。

时间复杂度$O(m\sqrt{n} + n\sqrt{n})$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 4e4 + 10;
const int M = 203; int belong[N];
int c[N], g[N], bg[N];
int f[N][M];
int l, r, kth;
int blocknum;
int L[M], R[M], ret[N]; struct node{
int l, r, x, y, id;
void scan(){ scanf("%d%d%d%d", &l, &r, &x, &y); } friend bool operator < (const node &a, const node &b){
return belong[a.l] == belong[b.l] ? a.r < b.r : belong[a.l] < belong[b.l];
}
} q[N]; int a[N], val[N];
int bs, cnt;
int n, m; void remove(int x, int y){
--f[y][belong[x]];
if (g[y] == 1) --bg[belong[y]];
--g[y];
} void add(int x, int y){
++f[y][belong[x]];
if (g[y] == 0) ++bg[belong[y]];
++g[y];
} int solve(int i){
int num = 0;
rep(j, 1, blocknum){
num += bg[j];
if (num >= q[i].x){
num -= bg[j];
rep(k, L[j], R[j]){
num += (int)(g[k] > 0);
if (num == q[i].x) return k;
}
}
} return 0;
} int calc(int i, int x){
int num = 0;
rep(j, 1, blocknum){
num += f[x][j];
if (num >= q[i].y){
num -= f[x][j];
rep(k, L[j], R[j]){
num += (int)(c[k] == x);
if (num == q[i].y) return k;
}
}
} return 0;
} int main(){ scanf("%d", &n);
rep(i, 1, n) scanf("%d", a + i), val[i] = a[i], q[i].id = i; sort(val + 1, val + n + 1);
cnt = unique(val + 1, val + n + 1) - val - 1;
rep(i, 1, n) a[i] = lower_bound(val + 1, val + cnt + 1, a[i]) - val; bs = sqrt(n);
rep(i, 1, n) belong[i] = (i - 1) / bs + 1;
blocknum = belong[n]; rep(i, 1, blocknum) L[i] = 1e9, R[i] = 0;
rep(i, 1, n){
L[belong[i]] = min(L[belong[i]], i);
R[belong[i]] = max(R[belong[i]], i);
} scanf("%d", &m);
rep(i, 1, m) q[i].scan();
sort(q + 1, q + m + 1); rep(i, 1, n) add(a[i], 0);
l = 1, r = 0; rep(i, 1, m){
while (r < q[i].r){
++r;
remove(a[r], c[a[r]]);
++c[a[r]];
add(a[r], c[a[r]]);
} while (r > q[i].r){
remove(a[r], c[a[r]]);
--c[a[r]];
add(a[r], c[a[r]]);
--r;
} while (l > q[i].l){
--l;
remove(a[l], c[a[l]]);
++c[a[l]];
add(a[l], c[a[l]]);
} while (l < q[i].l){
remove(a[l], c[a[l]]);
--c[a[l]];
add(a[l], c[a[l]]);
++l;
} kth = solve(i);
ret[q[i].id] = val[calc(i, kth)]; } rep(i, 1, m) printf("%d\n", ret[i]);
return 0;
}

  

牛客练习赛10 E题 数列查找 (分块思想 + 莫队算法)的更多相关文章

  1. 牛客练习赛44 B题 (思维)

    链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 给出n条线段,第i条线段的长度为ai, 每次可以从第i条线段的j位置跳到第i + 1条线段的j+ ...

  2. 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)

    链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  3. 牛客练习赛32 B题 Xor Path

    链接:https://ac.nowcoder.com/acm/contest/272/B来源:牛客网 题目描述 给定一棵n个点的树,每个点有权值.定义表示  到  的最短路径上,所有点的点权异或和. ...

  4. 牛客练习赛51 D题

    链接:https://ac.nowcoder.com/acm/contest/1083/D来源:牛客网 有一个草原可以用一个1~400的数轴表示.有n头羊和q个查询.每头羊的编号分别是1,2,3…n. ...

  5. 牛客挑战赛48E-速度即转发【带修莫队,分块】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出\(n\)个数字的一个序列,\(m\)个操作. 给出\(l,r,k\),求一个最大 ...

  6. 牛客练习赛 26 C题 城市规划【贪心】

    <题目链接> 题目描述 小a的国家里有n个城市,其中第i和第i - 1个城市之间有无向道路连接,特殊的,第1个城市仅与第2个城市相连为了减轻道路维护负担,城市规划局局长MXT给出了m个要求 ...

  7. 牛客练习赛 26 B题 烟花【DP】(经典)

    <题目链接> 题目描述 小a有个烟花,每个烟花代表着互不相同的颜色,对于第个烟花,它有的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生种颜色的概率 输入描述: ...

  8. 牛客练习赛53 B题调和级数

    https://ac.nowcoder.com/acm/contest/1114/B 这题时间卡的比较死,多了一个快速幂的logn就过不了这题. #include<bits/stdc++.h&g ...

  9. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

随机推荐

  1. Crane UVA - 1611 思路+构造

    题目:题目链接 思路:思路+构造,假设 i  在pos 位置,那么如果 (pos-i-1)*2+i+1 <= n,那么可以操作一次换过来,如果他们之间元素个数是偶数,那么交换 i - pos,如 ...

  2. 《鸟哥的Linux私房菜》学习笔记(9)——条件判断

    一.条件判断表达式                                                          条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式 [ ...

  3. 使用WMI Filter 实现组策略的筛选!

    今天接到一个客户的一个问题,提到需要分系统版本分发相应的MSI程序.比如简体版接受简体版的分发程序,繁体版接受繁体版的分发程序!这个建立组策略的不同版本分发本身不会太难,我们只需要建立两个不同组策略分 ...

  4. Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码

    前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频,学习了一下Asp.net页面生命周期,当时看的时候,因为内功不够深厚,看起来很吃力,现在回头温习了一下,还是有点收获的,于是想用博客记录一 ...

  5. BugKu 2B+基于python的opencv的安装-------CTF 盲水印的套路

    BugKu杂项-2B 下载图片后,binwalk下跑一跑,发现有个zip,分离. 值得一提的是,这个zip是伪加密的. 但是你在分离的时候,伪加密的图片也给你分离出来了.这两个图片2B和B2肉眼看起来 ...

  6. Leetcode 639.解码方法2

    解码方法2 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 除了上述的条件以外,现在加密字符串可以包含字符 ' ...

  7. java的ArrayList使用方法详解

    ArrayList是Java的链表类,在项目开发中十分常见,那么怎样对ArrayList进行添加.删除.修改.查询.遍历呢?本文将进行详细阐述. 工具/原料   java 一.ArrayList的添加 ...

  8. 基于jQuery的插件

    jQuery Validation 验证框架 jQuery Form Ajax表单插件 jQuery UI插件 Easy UI

  9. BZOJ 2190:[SDOI2008]仪仗队(欧拉函数)

    [SDOI2008]仪仗队 Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视 ...

  10. SCU 4438 Censor(哈希+模拟栈)

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text \(p\). He ...