3809: Gty的二逼妹子序列

Time Limit: 80 Sec  Memory Limit: 28 MB
Submit: 1387  Solved: 400
[Submit][Status][Discuss]

Description

Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。
 
对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。
 
为了方便,我们规定妹子们的美丽度全都在[1,n]中。
 
给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl...sr中,权值∈[a,b]的权值的种类数。

Input

第一行包括两个整数n,m(1<=n<=100000,1<=m<=1000000),表示数列s中的元素数和询问数。
 
第二行包括n个整数s1...sn(1<=si<=n)。
 
接下来m行,每行包括4个整数l,r,a,b(1<=l<=r<=n,1<=a<=b<=n),意义见题目描述。
 
保证涉及的所有数在C++的int内。
 
保证输入合法。

Output

对每个询问,单独输出一行,表示sl...sr中权值∈[a,b]的权值的种类数。

Sample Input

10 10
4 4 5 1 4 1 5 1 2 1
5 9 1 2
3 4 7 9
4 4 2 5
2 3 4 7
5 10 4 4
3 9 1 1
1 4 5 9
8 9 3 3
2 2 1 6
8 9 1 4

Sample Output

2
0
0
2
1
1
1
0
1
2

HINT

样例的部分解释:
 
5 9 1 2
子序列为4 1 5 1 2
在[1,2]里的权值有1,1,2,有2种,因此答案为2。
 
3 4 7 9
子序列为5 1
在[7,9]里的权值有5,有1种,因此答案为1。
 
4 4 2 5
子序列为1
没有权值在[2,5]中的,因此答案为0。
 
2 3 4 7
子序列为4 5
权值在[4,7]中的有4,5,因此答案为2。
 
建议使用输入/输出优化。

Source

 

[Submit][Status][Discuss]

初识莫队算法,大体记录一下。

莫队算法可以用来解决一类区间询问问题,例如一道经典的例题

给出一个序列,还有若干次询问,每次询问在区间[l,r]中有多少个数字出现了3次及3次以上。

先考虑暴力算法,不难想到对于每个询问,扫描一遍区间,用数组记录下每个数字出现的次数并及时统计出现3次及以上的数字个数,时间复杂度O(询问数*区间大小)。

再考虑高级算法,就是维护一段区间内的数字出现次数以及3次及三次以上的数字个数,区间每次可以O(1)的向某个方向(左或右)扩展一个元素,或弹出一个元素,只需要修改该数字的出现次数,并检查是否发生了从3到2或从2到3的“质变”即可。这个算法相较于上一个暴力算法并没与在复杂度上体现出什么优势,但这是莫队算法的基础。

最后看莫队算法,采用类似于分块的sqrt(n)划分方式,先将所有询问离线,按照询问的区间左端点排序,每sqrt(n)个单位长度划分为一组,注意是按照长度。然后对于每一组询问,在组内对询问按照区间右端点排序,使其单调,然后暴力处理一个组内的所有询问即可。由于左端点相距至多sqrt(n)个长度,所有每次维护的区间的左端点最多进行sqrt(n)次改变(加入元素或删除元素),而区间的右端点由于单调性质至多移动n个单位长度,全局复杂度O(n*sqrt(n)),优秀之极。

对于这道题,一开始的想法是莫队算法+树状数组(或线段树)什么的,时间复杂度O(N*sqrt(N)*log(N)),然而亲身实践之后并没有卡过去,看来出题人没有那么友好。

考虑把树状数组的O(logN)加入和O(logN)查询做一些调整,用分块的O(1)插入和O(sqrt(N))查询替代,全局复杂度降至O(NsqrtN)。

 #include <bits/stdc++.h>

 template <class T>
inline void read(T &num) {
register int neg = false;
register int bit = getchar(); while (bit <= '') {
if (bit == '-')
neg ^= neg;
bit = getchar();
} num = ; while (bit >= '') {
num = num*
+ bit - '';
bit = getchar();
} if (neg)num = -num;
} const int N = 1e5 + ;
const int M = 1e6 + ; int n, m, s, num[N], cnt[N], sgl[N], sum[N]; /*<--- QRY --->*/ struct query {
int l, r, a, b, id, ans;
}qry[M]; inline bool cmp_lr(const query &A, const query &B) {
if (A.l / s != B.l / s)
return A.l < B.l;
else
return A.r < B.r;
} inline bool cmp_id(const query &A, const query &B) {
return A.id < B.id;
} /*<--- MO --->*/ inline int ask(int a, int b) {
if (a / s == b / s) {
int ret = ;
for (int i = a; i <= b; ++i)ret += sgl[i];
return ret;
}
else {
int ret = , lt = a / s + , rt = b / s - ;
for (int i = lt; i <= rt; ++i)ret += sum[i];
for (int i = a; i / s < lt; ++i)ret += sgl[i];
for (int i = b; i / s > rt; --i)ret += sgl[i];
return ret;
}
} inline void add(int k, int v) {
sgl[k] += v, sum[k/s] += v;
} inline void insert(int k) {
if (++cnt[k] == )add(k, );
} inline void remove(int k) {
if (--cnt[k] == )add(k, -);
} /*<--- MAIN --->*/ signed main(void) {
read(n);
read(m); s = sqrt(n); for (int i = ; i <= n; ++i)
read(num[i]); for (int i = ; i <= m; ++i) {
qry[i].id = i;
read(qry[i].l);
read(qry[i].r);
read(qry[i].a);
read(qry[i].b);
} memset(cnt, , sizeof(cnt));
memset(sum, , sizeof(sum));
memset(sgl, , sizeof(sgl)); std::sort(qry + , qry + + m, cmp_lr); for (int i = , x = , y = ; i <= m; ++i) {
while (x < qry[i].l)remove(num[x]), ++x;
while (y > qry[i].r)remove(num[y]), --y;
while (x > qry[i].l)--x, insert(num[x]);
while (y < qry[i].r)++y, insert(num[y]);
qry[i].ans = ask(qry[i].a, qry[i].b);
} std::sort(qry + , qry + + m, cmp_id); for (int i = ; i <= m; ++i)
printf("%d\n", qry[i].ans);
}

@Author: YouSiki

BZOJ 3809: Gty的二逼妹子序列的更多相关文章

  1. Bzoj 3809: Gty的二逼妹子序列 莫队,分块

    3809: Gty的二逼妹子序列 Time Limit: 35 Sec  Memory Limit: 28 MBSubmit: 868  Solved: 234[Submit][Status][Dis ...

  2. BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...

  3. BZOJ 3809 Gty的二逼妹子序列(莫队+分块)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3809 [题目大意] 给定一个长度为n(1<=n<=100000)的正整数序 ...

  4. bzoj 3809 Gty的二逼妹子序列——莫队+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 容易想到树状数组维护值域.但修改和查询都是 log 太慢. 考虑有 nsqrt(n) ...

  5. [ AHOI 2013 ] 作业 & [ BZOJ 3809 ] Gty的二逼妹子序列

    \(\\\) Description 给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问: 对于一个区间 \([L_i,R_i]\),问区间内有多少个数在 \([a_i,b_i]\ ...

  6. bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段 ...

  7. bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)

    [题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...

  8. BZOJ 3809: Gty的二逼妹子序列 & 3236: [Ahoi2013]作业 [莫队]

    题意: 询问区间权值在$[a,b]$范围内种类数和个数 莫队 权值分块维护种类数和个数$O(1)-O(\sqrt{N})$ #include <iostream> #include < ...

  9. BZOJ.3809.Gty的二逼妹子序列(分块 莫队)

    题目链接 /* 25832 kb 26964 ms 莫队+树状数组:增加/删除/查询 都是O(logn)的,总时间复杂度O(m*sqrt(n)*logn),卡不过 莫队+分块:这样查询虽然变成了sqr ...

随机推荐

  1. 解决 安装cocoapods失败,提示 requires Ruby version >=2.2.2

    步骤如下: rvm install ruby-2.2 但是,但是竟然报错了,具体我忘记额,但是是权限和brew的问题,那么我又转向修复brew: // 清理原来brew rm -rf /usr/loc ...

  2. php关键词替换的类(避免重复替换,保留与还原原始链接)

    转载:http://www.169it.com/blog_article/601549531.html 本节主要内容:一个关键词替换的类 主要可以用于关键词过滤,或关键词查找替换方面. 实现过程分析: ...

  3. 基于显卡的光栅化渲染器Gaius计划

    决定实现一个基于显卡的光栅化渲染器,能将一些基于显卡的新算法融入其中.

  4. VS的安装

    一 安装过程 我直接在官网下载的 2015版本 ,软件比较大 安装起来比较花时间 同时也装了中文语言包,下面附上安装过程中的一些截图. 二 现在正在摸索如何使用,百度教程,等会附上单元测试.

  5. SELECT CAST(GETDATE() AS VARCHAR(10)) 显示不同格式的原因

    开发人员测试时,发现生产服务器与测试服务器执行SELECT CAST(GETDATE() AS VARCHAR(10))语句显示的格式不一样.如下所示 Server A Server B 其实出现这个 ...

  6. get_locked_objects_rpt.sql

    在metalink上看到一个脚本(get_locked_objects_rpt.sql),非常不错,如下所示 /*------------------------------------------- ...

  7. asp.net signalR 专题—— 第三篇 如何从外部线程访问 PersistentConnection

    在前面的两篇文章中,我们讲到的都是如何将消息从server推向client,又或者是client再推向server,貌似这样的逻辑没什么异常,但是放在真实 的环境中,你会很快发现有一个新需求,如何根据 ...

  8. C++中的也能使用正则表达式

    正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同 ...

  9. [WPF系列]基础学习(一) WPF是什么?

    引言 学习之前,我们首先大概了解下WPF诞生的背景以及它所能解决的问题或者新颖之处.WPF作为微软新一代的用户界面技术,   WPF简介 WPF的全称是WindowsPresentationFound ...

  10. Web报表工具JS开发之日期校验

    在报表开发过程中,我们常常需要对查询界面进行日期校验.例如有两个参数:开始日期和结束日期,我们要校验的是:开始日期与结束日期不能为空,结束日期必须在开始日期之后以及结束日期必须在开始日期后的某个时间段 ...