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) --------------------------- ...
随机推荐
- 隐藏和显示效果js动画
<div id='ctt' style='margin-left: 50px; color: white'> <input type="button ...
- good mind
1.如果你能做的事,员工也能做,就让员工做好了. 2.代码是一行一行执行的. 3.如果你找不到NB的人,那就找勤奋点的人.
- hadoop 任务执行优化
任务执行优化 1. 推测式执行: 如果jobtracker 发现有拖后的任务,会再启动一个相同的备份任务,然后哪个先执行完就会去kill掉另一个,因此会在监控页面上经常能看到正常执行完的作业会有被ki ...
- log4j示例
示例代码:此示例从控制台输入日志,设置了输出等级. # # Log4J Settings for log4j 1.2.x (via jakarta-commons-logging) # # The f ...
- 你不需要jQuery(四)
jQuery是个好东西.它诞生于IE6在互联网称霸的那个时代.jQuery的存在让我们的代码能很好的兼容各种平台. 然而,到如今,浏览器技术已经取得了巨大的进步.我们可以自由的使用所有最新众多ES5/ ...
- ASP + ACCESS保存图片文件之实现
con.execute "CREATE tblImg (lngId COUNTER PRIMARY KEY, binImg IMAGE)" set ads=createobject ...
- WCF 绑定的选择
选自<WCF服务编程中文版> 第一章 WCF基础 绑定服务之间的通信方式是多种多样的,有多种可能的通信模式.包括:同步的请求/ 应答(Request/Reply)消息,或者异步的“即发即弃 ...
- ???????????? no permissions
1.一手鞋地址 google http://developer.android.com/tools/device.html 我处理的方法如下: 我的问题: android的版卡 在Ubuntu12.0 ...
- 如何用Java语言向串口读写数据
原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...
- java:I/O 一行一行读取和写入
BufferedReader逐行读取 import java.io.*; class Test { public static void main(String args []){ FileReade ...