题目:

Description

HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一
段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一
个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只
好求助睿智的你,来解决这个问题。

Input

第一行:一个整数N,表示项链的长度。 
第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 
第三行:一个整数M,表示HH询问的个数。 
接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
N ≤ 50000,M ≤ 200000。

Output

M行,每行一个整数,依次表示询问对应的答案。

Sample Input

6
1 2 3 4 3 5
3
1 2
3 5
2 6

Sample Output

2
2
4

HINT

 

Source

题解:

莫队算法模板题···也可以用分块做···

先说说针对数字序列的莫队吧···核心思想就是在题目允许询问离线的情况下,先将序列分块,然后将询问排序····第一关键字是left的所在块(越小越靠前)···第二关键字是right的大小(越小越靠前),然后创建tail和head指针,根据询问移动tail和head的同时更改所维护的答案·····

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=5e4+;
const int M=2e5+;
struct node
{
int l,r,id;
}q[M];
int head,tail,id[N],num[N],cnt[],n,m,s,tots,ans,anss[M];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
bool cmp(node x,node y)
{
return (id[x.l]<id[y.l])||(id[x.l]==id[y.l]&&x.r<y.r);
}
int main()
{
//freopen("a.in","r",stdin);
n=R();s=(int)sqrt(n);
for(int i=;i<=n;i++) num[i]=R();
m=R();
for(int i=;i<=m;i++)
q[i].l=R(),q[i].r=R(),q[i].id=i;
for(int i=;i<=n;i++)
{
if(i%s==) id[i]=++tots;
else id[i]=tots;
}
sort(q+,q+m+,cmp);
for(int i=;i<=m;i++)
{
while(head<q[i].l)
{
cnt[num[head]]--;
if(!cnt[num[head]]) ans--;
head++;
}
while(head>q[i].l)
{
head--;
if(!cnt[num[head]]) ans++;
cnt[num[head]]++;
}
while(tail>q[i].r)
{
cnt[num[tail]]--;
if(!cnt[num[tail]]) ans--;
tail--;
}
while(tail<q[i].r)
{
tail++;
if(!cnt[num[tail]]) ans++;
cnt[num[tail]]++;
}
anss[q[i].id]=ans;
}
for(int i=;i<=m;i++)
printf("%d\n",anss[i]);
return ;
}

算法复习——莫队算法(bzoj1878)的更多相关文章

  1. 信心题--FUOJ2226(莫队算法)

    http://acm.fzu.edu.cn/problem.php?pid=2226 信心题,还说是信心题,题目给的真好.但是一点都不像信心题. 又是一个新的算法,莫队算法 莫队算法是一个用数组就可以 ...

  2. D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力

    莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...

  3. XOR and Favorite Number(莫队算法+分块)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  4. 【国家集训队2010】小Z的袜子[莫队算法]

    [莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...

  5. 基于Manhattan最小生成树的莫队算法

    点u,v的Manhattan距离:distance(u,v)= |x2-x1|+|y2-y1| Manhattan最小生成树:边权值为两个点Manhattan距离的最小生成树. 普通算法:prim复杂 ...

  6. 莫队算法详解和c实现

    解析和实现 摘要:        莫队算法是一个对于区间.树或其他结构离线(在线)维护的算法,此算法基于一些基本算法,例如暴力维护,树状数组,分块,最小曼哈顿距离生成树,对其进行揉合从而产生的一个简单 ...

  7. 【BZOJ】4358: permu 莫队算法

    [题意]给定长度为n的排列,m次询问区间[L,R]的最长连续值域.n<=50000. [算法]莫队算法 [题解]考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[ ...

  8. hdu 5145(莫队算法+逆元)

    NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10299  Solved: 4685[Sub ...

随机推荐

  1. 查看进程lsof

    查看8000端口 lsof -i :8000 杀死进程 pkill -ns <pid>

  2. 从汇编看c++中临时对象的析构时机

    http://www.cnblogs.com/chaoguo1234/archive/2013/05/12/3074425.html c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...

  3. git 添加 ,密匙

    转载此处   https://blog.csdn.net/xiayiye5/article/details/79652296

  4. python之路——递归函数

    阅读目录 楔子 初识递归 再谈递归 递归函数与三级菜单 递归函数与二分查找算法 楔子 在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前 ...

  5. 学c++有感

    第一次学习这么课程的时候,感觉课堂和教材的内容基本上都能接受和理解,但真正实际动手编写程序又觉得一片空白无从下手,可谓是“欲起平之恨无力.”一开始编写程序时,总是出现错误,从而产生了恐惧感,认为自己不 ...

  6. perl学习之argument

    Arguments are the values you pass to a Perl script. Each value on the command line after the name of ...

  7. cache控制器取值从TCM/CACHE/FLASH

    cache 控制器顶层有4组接口,分别为输入I/D bus ,输出TCM bus /Cache bus /direct flash bus (走cache ID bus matrix) flash 控 ...

  8. Python解答力扣网站题库简单版----第三讲

    1041. 困于环中的机器人 题库链接: 1041. 困于环中的机器人. 题干 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G" ...

  9. JavaScript注释

    JavaScript注释有两种方式: 1.单行注释. 2.多行注释. 单行注释 单行注释以“//”开头. <script type="text/javascript"> ...

  10. SVN如何避免冲突

    在团队开发时,必然会用到代码版本控制工具,比如SVN. 但是多人共同维护同一份代码,当对同一文件进行增删时,就可能造成冲突,如何尽可能避免冲突相当重要. 首先,每次,新建任何文档,都会修改项目文件,所 ...