【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)
3809: Gty的二逼妹子序列
Time Limit: 80 Sec Memory Limit: 28 MB
Submit: 1728 Solved: 513Description
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 4Sample Output
2
0
0
2
1
1
1
0
1
2HINT
样例的部分解释: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
【分析】
一开始打莫队+树状数组,好尴尬80s T了卡评测。。
然后因为树状数组logn修改 logn查询。
这里分块就比较优越的(其实跟我之前看的块状链表没什么区别吧?),分块做的话是单点修改O(1),询问$\sqrt n$的。
对于莫队这种单点改来改去的题目就很好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 100010
#define Maxm 1000010 int mymin(int x,int y) {return x<y?x:y;} int s[Maxn],sm[Maxn],bl[Maxn];
int sq,n,m; struct node {int x,y,a,b,id,ans;}t[Maxm];
bool cmp(node x,node y) {return (x.x/sq==y.x/sq)?(x.y<y.y):(x.x<y.x);}
bool cmp2(node x,node y) {return x.id<y.id;} int c[Maxn],rt[Maxn]; int query(int x,int y)
{
int L=bl[x],R=bl[y];
int ans=;
for(int i=L+;i<R;i++) ans+=c[i];
if(L==R)
{
for(int i=x;i<=y;i++) ans+=(sm[i]>=?:);
}
else
{
for(int i=x;i<=rt[L];i++) ans+=(sm[i]>=?:);
for(int i=rt[R-]+;i<=y;i++) ans+=(sm[i]>=?:);
}
return ans;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&s[i]);
for(int i=;i<=n;i++) sm[i]=;
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&t[i].x,&t[i].y,&t[i].a,&t[i].b);
t[i].id=i;
}
sq=(int)ceil(sqrt((double)n));
sort(t+,t++m,cmp);
for(int i=;i<=n;i++) bl[i]=i/sq+;
for(int i=;i<=sq;i++) rt[i]=mymin(sq*i-,n);
for(int i=;i<=sq;i++) c[i]=;
int l=,r=;
for(int i=;i<=m;i++)
{
while(r<t[i].y)
{
if(sm[s[r+]]==) c[bl[s[r+]]]++;
sm[s[r+]]++;
r++;
}
while(l>t[i].x)
{
if(sm[s[l-]]==) c[bl[s[l-]]]++;
sm[s[l-]]++;
l--;
}
while(l<t[i].x)
{
if(sm[s[l]]==) c[bl[s[l]]]--;
sm[s[l]]--;
l++;
}
while(r>t[i].y)
{
if(sm[s[r]]==) c[bl[s[r]]]--;
sm[s[r]]--;
r--;
}
t[i].ans=query(t[i].a,t[i].b);
}
sort(t+,t++m,cmp2);
for(int i=;i<=m;i++) printf("%d\n",t[i].ans);
return ;
}
2017-03-26 15:23:10
【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)的更多相关文章
- Bzoj 3809: Gty的二逼妹子序列 莫队,分块
3809: Gty的二逼妹子序列 Time Limit: 35 Sec Memory Limit: 28 MBSubmit: 868 Solved: 234[Submit][Status][Dis ...
- bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段 ...
- bzoj 3809 Gty的二逼妹子序列——莫队+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 容易想到树状数组维护值域.但修改和查询都是 log 太慢. 考虑有 nsqrt(n) ...
- 【BZOJ3809】Gty的二逼妹子序列 莫队 分块
题目描述 给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出区间\([l,r]\)有多少范围在\([a,b]\)的权值. \(n\leq 100000, ...
- [BZOJ3809]Gty的二逼妹子序列[莫队+分块]
题意 给出长度为 \(n\) 的序列,\(m\) 次询问,每次给出 \(l,r,a,b\) ,表示询问区间 \([l,r]\) 中,权值在 \([a,b]\) 范围的数的种类数. \(n\leq 10 ...
- [AHOI2013]作业 & Gty的二逼妹子序列 莫队
---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...
- BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块
Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...
- 【BZOJ 3809】Gty的二逼妹子序列
这个莫队如果用线段树来维护的话,复杂度是$O(n\sqrt{n}logn+qlogn)$ 很明显,可以看出来莫队每次$O(1)$的移动因为套上了线段树变成了$O(logn)$,但莫队移动的总数是非常大 ...
- BZOJ 3809: Gty的二逼妹子序列
3809: Gty的二逼妹子序列 Time Limit: 80 Sec Memory Limit: 28 MBSubmit: 1387 Solved: 400[Submit][Status][Di ...
随机推荐
- HttpClient 模拟登陆知乎
最近做爬虫相关工作,我们平时用HttpWebRequest 比较多,每一个Url都要创建一个HttpWebRequest实例, 而且有些网站验证比较复杂,在登陆及后续抓取数据的时候,每次请求需要把上次 ...
- 20155117王震宇 2006-2007-2 《Java程序设计》第二周学习总结
学号 2006-2007-2 <Java程序设计>第X周学习总结 教材学习内容总结 学习一门语言首先要熟悉基础的语法,注意不要和之前学过的语言知识混淆. java严格区分大小写. 教材学习 ...
- 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
题目链接 sb错误调了3hour+.. bfs预处理出每个\(.\)到每个\(D\)的最短距离. 二分时间\(t\),把每个\(D\)拆成\(t\)个点,这\(t\)个点两两连边,流量\(INF\)表 ...
- Redis笔记之常用命令
keys keys用来获取符合指定规则的键,keys的语法规则如下: keys <pattern> 比如最简单的全等匹配,下面这个命令只会匹配键值完全等于foo的: 127.0.0.1:6 ...
- DataFrame衍生新特征操作
1.DataFrame中某一列的值衍生为新的特征 #将LBL1特征的值衍生为one-hot形式的新特征 piao=df_train_log.LBL1.value_counts().index #先构造 ...
- 在Nginx服务器上屏蔽IP
采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走. 本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现. 1.查找要屏蔽的 ...
- groovy的三个强劲属性(一)Gpath
我们先从GPath开始,一个GPath是groovy代码的一个强劲对象导航的结构,名称的选择与XPath相似,XPath是一个用来描述XML(和等价物)文档的标准,正如XPath,GP ...
- sed的额外用法(网摘)
#在我开始动手写一个一个的脚本的时候才会看到更多的用法 1. 在某行的前一行或后一行添加内容(前提是要确定行的内容) # 匹配行前加 sed -i '/allow/ideny' httpd.conf ...
- 制作自动化系统安装U盘
1.挂载CentOS6.6镜像 [root@test88 ~]# mkdir /application/tools -p [root@test88 ~]# cd /application/tools/ ...
- Linux下var目录介绍
var目录 /var 包括系统运行时要改变的数据.其中包括每个系统是特定的,即不能够与其他计算机共享的目录,如/var/log,/var/lock,/var/run.有些目录还是可以与其他系统共享,如 ...