BZOJ2038: [2009国家集训队]小Z的袜子(hose) 莫队算法
要使用莫队算法前提 ,已知[l,r]的答案,要能在logn或者O(1)的时间得到[l+1,r],[l-1,r],[l,r-1],[l,r+1],适用于一类不修改的查询
优美的替代品——分块
将n个数分成sqrt(n)块
按区间排序,以左端点所在块内为第一关键字,右端点为第二关键字,进行排序
也就是以( pos [l],r )排序
然后搞就可以了
搞得过程是这样的:
一、i与i+1在同一块内,r单调递增,所以r是O(n)的。由于有n^0.5块,所以这一部分时间复杂度是n^1.5。
二、i与i+1跨越一块,r最多变化n,由于有n^0.5块,所以这一部分时间复杂度是n^1.5
三、i与i+1在同一块内时变化不超过n^0.5,跨越一块也不会超过2*n^0.5,不妨看作是n^0.5。由于有n个数,所以时间复杂度是n^1.5
于是就变成了O(n^1.5)了
——————————以上来自http://hzwer.com/2782.html,略有修改
黄学长的前两条说的是更新区间右端点r的复杂度是O(n^1.5),这个说的很清楚;
最后一条说的的是更新区间左端点l的复杂度,我想略做添加
排序后的i和i+1个查询如果在同一块变化不超过sqrt(n),但是当跨越一块时,最大却不止是2*n^0.5,可以是n,
这样我们可以在每一个没有查询的块里添加一个辅助查询区间(l=该块的右界,r为下一个真正询问的右界 ),这样最多添加n^0.5这样的查询点 这样总的 查询个数是 n+n^0.5;
这样再应用黄学长第三条,i,i+1在一块,l不超过n^0.5,跨越一块(此时由于添加辅助查询点)最多是2*n^0.5
一共有n+n^0.5个查询 所以复杂度是 (n+n^0.5)*n^0.5=(n^0.5+1)n 所以复杂度是n^1.5
(添加辅助点不会变慢)
所以最后复杂度是O(n^1.5)
代码如下:(代码写的不好,如果要看还是看上述链接的比较好,以下仅供娱乐)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<cstdlib>
#include<queue>
#include<map>
#include<set>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn=;
LL gcd(LL a, LL b)
{
if(a==)return b;
while(a%b)
{
LL t=a%b;
a=b;
b=t;
}
return b;
}
int num[maxn],pos[maxn],o[maxn];
LL ans=;
struct node
{
int l,r,id;
LL a,b;
} res[maxn];
bool cmp1(node x,node y)
{
if(pos[x.l]==pos[y.l])return x.r<y.r;
return x.l<y.l;
}
bool cmp2(node x,node y)
{
return x.id<y.id;
}
void change(int pos,int op)
{
LL t=num[o[pos]];
ans-=t*(t-)/;
num[o[pos]]+=op;
t=num[o[pos]];
ans+=t*(t-)/;
}
int main()
{
int n,m;
ans=;
scanf("%d%d",&n,&m);
int block=(int)(sqrt(n));
for(int i=; i<=n; ++i)
scanf("%d",&o[i]),pos[i]=(i-)/block+;
for(int i=; i<=m; ++i)
scanf("%d%d",&res[i].l,&res[i].r),res[i].id=i;
sort(res+,res+m+,cmp1);
for(int i=,l,r; i<=m; ++i)
{
if(i==)
for(int j=res[i].l; j<=res[i].r; ++j)
change(j,);
else
{
for(; r+<=res[i].r; ++r)
change(r+,);
for(; r>res[i].r; --r)
change(r,-);
for(; l<res[i].l; ++l)
change(l,-);
for(; l->=res[i].l; --l)
change(l-,);
}
l=res[i].l,r=res[i].r;
if(res[i].l==res[i].r)
{
res[i].a=;
res[i].b=;
continue;
}
res[i].a=ans;
LL t=res[i].r-res[i].l+;
res[i].b=t*(t-)/;
t=gcd(res[i].a,res[i].b);
res[i].a/=t;
res[i].b/=t;
}
sort(res+,res++m,cmp2);
for(int i=; i<=m; ++i)
printf("%lld/%lld\n",res[i].a,res[i].b);
return ;
}
BZOJ2038: [2009国家集训队]小Z的袜子(hose) 莫队算法的更多相关文章
- BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 3577 Solved: 1652[Subm ...
- [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 10299 Solved: 4685[Sub ...
- [bzoj2038][2009国家集训队]小Z的袜子(hose)——莫队算法
Brief Description 给定一个序列,您需要处理m个询问,每个询问形如[l,r],您需要回答在区间[l,r]中任意选取两个数相同的概率. Algorithm Design 莫队算法入门题目 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- 【bzoj2038】[2009国家集训队]小Z的袜子(hose) 莫队算法
原文地址:http://www.cnblogs.com/GXZlegend/p/6803860.html 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终 ...
- bzoj2038: [2009国家集训队]小Z的袜子(hose) [莫队]
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ2038[2009国家集训队]小Z的袜子(hose)——莫队
题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号 ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
随机推荐
- SCRUM,一个采用迭代,增量方法来优化可预见控制风险
Scrum是一个用于开发和维持复杂产品的框架,是一个增量的,迭代的开发过程.在这个框架中,整个开发过程是由若干个短的迭代周期组成,一个短的迭代周期称为一个Sprint,每个Sprint的建议长度是2到 ...
- JavaScript里最有效率的功能特征检测方法
代码执行效率对于程序员和程序来说都是至关重要的,尤其是遇到了那些需要大量调用.反复调用的函数方法.在很多Javascript框架里你都能看到有反复调用的函数.当在使用这些框架时,我们必须小心翼翼的尽量 ...
- Matlab划分测试集和训练集
% x是原数据集,分出训练样本和测试样本 [ndata, D] = size(X); %ndata样本数,D维数 R = randperm(ndata); %1到n这些数随机打乱得到的一个随机数字序列 ...
- MySQL分区表(转)
查看分区情况 SELECT * FROM information_schema.PARTITIONS WHERE table_name='table_name': PARTITION_NAME:分区的 ...
- install Nagios on Unbuntu Unix
Ubuntu Quickstart Up To: ContentsSee Also: Quickstart Installation Guides, Security Considerations I ...
- [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序
本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...
- poj 1095 Trees Made to Order 卡特兰数
这题用到了卡特兰数,详情见:http://www.cnblogs.com/jackge/archive/2013/05/19/3086519.html 解体思路详见:http://blog.csdn. ...
- linux 磁盘读写性能测试
1. 测试读取速度 haparm -Tt /dev/xxx 1.1 获取硬盘设备名称: fdisk -l Disk /dev/xvdf: 365.0 GB, 365041287168 bytes 25 ...
- CURL与PHP-CLI的应用【CURL篇】
curl是一个极为强大的HTTP传输工具,支持文件的上传和下载; curl在命令行下的使用 命令参数 -a/--append 上传文件时,附加到目标文件 -A/--user-agent <str ...
- CentOS系统内核升级
yum -y update 升级所有包,改变软件设置和系统设置,系统版本内核都升级 yum -y upgrade 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变