算法复习——莫队算法(bzoj1878)
题目:
Description
Input
Output
M行,每行一个整数,依次表示询问对应的答案。
Sample Input
1 2 3 4 3 5
3
1 2
3 5
2 6
Sample Output
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)的更多相关文章
- 信心题--FUOJ2226(莫队算法)
http://acm.fzu.edu.cn/problem.php?pid=2226 信心题,还说是信心题,题目给的真好.但是一点都不像信心题. 又是一个新的算法,莫队算法 莫队算法是一个用数组就可以 ...
- D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力
莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...
- XOR and Favorite Number(莫队算法+分块)
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- 【国家集训队2010】小Z的袜子[莫队算法]
[莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...
- 基于Manhattan最小生成树的莫队算法
点u,v的Manhattan距离:distance(u,v)= |x2-x1|+|y2-y1| Manhattan最小生成树:边权值为两个点Manhattan距离的最小生成树. 普通算法:prim复杂 ...
- 莫队算法详解和c实现
解析和实现 摘要: 莫队算法是一个对于区间.树或其他结构离线(在线)维护的算法,此算法基于一些基本算法,例如暴力维护,树状数组,分块,最小曼哈顿距离生成树,对其进行揉合从而产生的一个简单 ...
- 【BZOJ】4358: permu 莫队算法
[题意]给定长度为n的排列,m次询问区间[L,R]的最长连续值域.n<=50000. [算法]莫队算法 [题解]考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[ ...
- hdu 5145(莫队算法+逆元)
NPY and girls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 10299 Solved: 4685[Sub ...
随机推荐
- TFS数据库分离附加经验总结
因TFS数据库已经100多G,所在的服务器D盘已没有空间满足tfs数据库的增长速度,故必须分离复制到其它盘.在分离过程中,先后分离了ReportServer.ReportServerTempDB.Tf ...
- sqlserver中drop、truncate和delete语句的用法
虽然小编不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方. 说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用 ...
- COGS 696. [IOI1996][USACO 2.3] 最长前缀
★ 输入文件:prefix.in 输出文件:prefix.out 简单对比时间限制:1 s 内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构 ...
- 用Hexo免费搭建你自己的博客
Hexo基于node.js,可用于生成静态博客,结合github和Mac,可以专注创作了. 深入学习见文末引用. hexo安装 brew install node npm install hexo-c ...
- MIPS简单入门
What ‘s the MIPS? 汇编语言 汇编语言是一类语言的总称,因处理器不同,而对应的不同机器的指令集也不同,产生了很多种汇编语言. 目前最流行的是ARM,MIPS,x86.ARM用于大量的移 ...
- Mac上安装Node和NPM【转】
http://www.jianshu.com/p/20ea93641bda 作为前端开发者,node和npm安装必不可少.然而有时会因为安装新的app(如MacPorts,慎装,它会修改基本环境变量以 ...
- MacBook Pro休眠掉电、耗电量大问题解决方案
1.前言 最近我的2015mbpMacBook Pro (Retina, 13-inch, early 2015)更新完10.14系统后,发现休眠待机一晚上后能掉5%电,白天待机4-5小时又掉了8%. ...
- 控制mysql数字转换
在实际工作中我们常常需要将数字进行格式化,比如将12.0073233变为12.01,或把12变为12.00,或把12变为0000012,这种格式之间的转换总结如下: 一,浮点数的转换--直接设 ...
- 如何用纯 CSS 创作一个雷达扫描动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VdbGvr 可交互视频 ...
- 如何用纯 CSS 创作一盘传统蚊香
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/BVpvMz 可交互视频教 ...