3809: Gty的二逼妹子序列

Time Limit: 35 Sec  Memory Limit: 28 MB
Submit: 868  Solved: 234
[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

 题解:
直接莫队加分块。(将颜色进行分块即可)
代码:
 #include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define MAXM 1000010
struct node
{
int l,r,a,b,id;
}q[MAXM];
int tot[MAXN],sum[],pos[MAXN],C[MAXN],block,ans[MAXM];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
bool cmp(node aa,node bb)
{
if(pos[aa.l]==pos[bb.l])return aa.r<bb.r;
return aa.l<bb.l;
}
void Del(int color)//删除一种颜色
{
tot[color]--;//该种颜色个数-1.
if(tot[color]==)sum[(color-)/block+]--;//以前有的颜色,现在没有了.(个数从1变为0.)
}
void Add(int color)//加上一种颜色
{
tot[color]++;//该种颜色个数+1.
if(tot[color]==)sum[(color-)/block+]++;//以前没有的颜色,现在有了.(个数从0变为1.)
}
int getans(int aa,int bb)
{
int gs=,left=(aa-)/block+,right=(bb-)/block+,i;
if(left==right)
{
for(i=aa;i<=bb;i++)if(tot[i]!=)gs++;
return gs;
}
for(i=aa;i<=left*block;i++)if(tot[i]!=)gs++;
for(i=left+;i<=right-;i++)gs+=sum[i];
for(i=(right-)*block+;i<=bb;i++)if(tot[i]!=)gs++;
return gs;
}
int main()
{
int n,m,i,L,R;
n=read();m=read();
for(i=;i<=n;i++)C[i]=read();
for(i=;i<=m;i++)
{
q[i].l=read();q[i].r=read();q[i].a=read();q[i].b=read();
q[i].id=i;
}
block=(int)sqrt(n);
for(i=;i<=n;i++)pos[i]=(i-)/block+;
sort(q+,q+m+,cmp);
memset(sum,,sizeof(sum));//每一块内的颜色个数.
memset(tot,,sizeof(tot));//枚举的区间内的每种颜色的个数.
L=;R=;
for(i=;i<=m;i++)
{
while(L<q[i].l)
{
Del(C[L]);
L++;
}
while(L>q[i].l)
{
L--;
Add(C[L]);
}
while(R<q[i].r)
{
R++;
Add(C[R]);
}
while(R>q[i].r)
{
Del(C[R]);
R--;
}
ans[q[i].id]=getans(q[i].a,q[i].b);
}
for(i=;i<=m;i++)printf("%d\n",ans[i]);
fclose(stdin);
fclose(stdout);
return ;
}

Bzoj 3809: Gty的二逼妹子序列 莫队,分块的更多相关文章

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

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

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

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

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

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

  4. [BZOJ3809]Gty的二逼妹子序列[莫队+分块]

    题意 给出长度为 \(n\) 的序列,\(m\) 次询问,每次给出 \(l,r,a,b\) ,表示询问区间 \([l,r]\) 中,权值在 \([a,b]\) 范围的数的种类数. \(n\leq 10 ...

  5. 【BZOJ3809】Gty的二逼妹子序列 莫队 分块

    题目描述 给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出区间\([l,r]\)有多少范围在\([a,b]\)的权值. \(n\leq 100000, ...

  6. BZOJ 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1387  Solved: 400[Submit][Status][Di ...

  7. [AHOI2013]作业 & Gty的二逼妹子序列 莫队

    ---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...

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

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

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

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

随机推荐

  1. ubuntu 12.04安装redis2.6.16

    1.下载源文件并安装 登录 http://www.redis.io/download 下载redis-2.6.16.tar.gz tar -zxf redis-2.6.16.tar.gz cd red ...

  2. eclipse EE neon创建dynamic web project时,卡在installing dynamic web module facet,解决办法

    我们在用eclipse EE neon创建dynamic web project时,如果你发现底部状态栏一直卡在installing dynamic web module facet,永远到不了100 ...

  3. CentOS 6下安装nodejs 0.9.0

    确保安装了python,大部分安装失败都是由于python版本过低导致.安装之前,升级python版本,升级步骤 http://www.tomtalk.net/wiki/Python. [root@S ...

  4. cmd 进入不同的驱动盘及上下级目录

    “开始”=>“运行”,输入”cmd“,此时进入的是系统管理员的等待命令 如果想进入相应的盘符,如 d 盘,则输入 cd d:\,然后再次输入 d: 即可进入 d: 盘,输入两次相当于第二在是询问 ...

  5. 修改Tomcat命令窗口的名字

    在运行多个tomcat窗口的时候,可以通过修改tomcat命令窗口的名字来区分不同的tomcat,修改如下: 找到tomcat下面的这个文件:tomcat_home\bin\catalina.bat, ...

  6. css3 iphone开关 移动端开关、按钮、input

    css3  iphone开关  移动端开关.按钮.input <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  7. jquery插件-validate

    1.引入js,css 下载地址:http://plugins.jquery.com/validate/ 2.设置验证规则:input的class添加以下验证属性 3.设置不符合规则的提示信息:添加da ...

  8. JQuery 字符串截取

    //字符串截取,全小写 strObj.substring(startIndex,endIndex); //需要注意大小写 strObj.lastIndexOf(String splitObj); // ...

  9. js事件冒泡原理及处理

    事件从根节点开始,逐级派送到子节点,若节点绑定了事件动作,则执行动作,然后继续走,这个阶段称为“捕获阶段(Capture)”:执行完捕获阶段后,事件由子节点往根节点派送,若节点绑定了事件动作,则执行动 ...

  10. 《C和指针》章节后编程练习解答参考——6.4

    <C和指针>——6.4 题目: 质数是只能被1和本身整除的整数. 在1到1000之间的质数,在数组中剔除不是质数的数. 解答代码: #include <stdio.h> #de ...