莫队算法&BZOJ2038
今天看了分块,顺便把基本的莫队学习了一下。
莫队算法是一种离线算法,复杂度可以达到O((M+N)*Sqrt(N));
对于询问区间的左端点分块,块内的右端点从小到大排列。
对区间进行偏移操作。
掌握一个思想基础:两个询问之间的状态跳转。如图,当前完成的询问的区间为[a,b],下一个询问的区间为[p,q],现在保存[a,b]区间内的每个颜色出现次数的sum[]数组已经准备好,[a,b]区间询问的答案Ans1已经准备好,怎样用这些条件求出[p,q]区间询问的Ans2?
考虑指针向左或向右移动一个单位,我们要付出多大的代价才能维护sum[]和Ans(即使得sum[],Ans保存的是当前[l,r]的正确信息)。我们美妙地对图中l,r的向右移动一格进行分析:
l指针向右移动一个单位,所造成的后果就是:我们损失了一个绿色方块。那么怎样维护?美妙地,sum[绿色]减去1。那Ans如何维护?先看分母,分母从n2变成(n-1)2,分子中的其他颜色对应的部分是不会变的,绿色却从sum[绿色]2变成(sum[绿色]-1)2 ,为了方便计算我们可以直接向给Ans减去以前该颜色的答案贡献(即sum[绿色]2)再加上现在的答案贡献(即(sum[绿色]-1)2 )。同理,观赏下面的r指针移动,将是差不多的。
复杂度分析:
右端点偏移复杂度不受询问影响,为O(N*Sqrt(N));
左端点偏移复杂度:因为块的大小为Sqrt(N),所以一次操作最多偏移Sqrt(N),复杂度为O(M*Sqrt(N));
code:
/**************************************************************
Problem: 2038
User: yekehe
Language: C++
Result: Accepted
Time:1756 ms
Memory:4256 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; char tc()
{
static char tr[],*A=tr,*B=tr;
return A==B&&(B=(A=tr)+fread(tr,,,stdin),A==B)?EOF:*A++;
} int read()
{
char c;while(c=tc(),c<''||c>'');
int x=c-'';while(c=tc(),c>=''&&c<='')x=x*+c-'';
return x;
} long long gcd(long long x,long long y){return !y?x:gcd(y,x%y);} long long N,Q,sum[],c[],ans=;
int B[],size;
struct Qr{long long x,y,id;}Qs[],A[];
int i,j;
inline int cmp(Qr x,Qr y){
return B[x.x]==B[y.x]?x.y<y.y:x.x<y.x;
} void updata(int x)
{
ans=ans-sum[c[x]]*sum[c[x]];
sum[c[x]]++;
ans=ans+sum[c[x]]*sum[c[x]];
} void remove(int x)
{
ans=ans-sum[c[x]]*sum[c[x]];
sum[c[x]]--;
ans=ans+sum[c[x]]*sum[c[x]];
} int main()
{
// freopen("x.txt","r",stdin);
N=read(),Q=read();
size=sqrt(Q);size+=(size*size<Q);
long long x,y;
for(i=;i<=N;i++)c[i]=read();
for(i=;i<=Q;i++)B[i]=(i-)/size+;
for(i=;i<=Q;i++)x=read(),y=read(),Qs[i]=(Qr){x,y,i};
sort(Qs+,Qs+Q+,cmp);
int l=,r=;
long long len,As;
for(i=;i<=Q;i++){
while(l>Qs[i].x)updata(--l);
while(l<Qs[i].x)remove(l++);
while(r>Qs[i].y)remove(r--);
while(r<Qs[i].y)updata(++r);
len=Qs[i].y-Qs[i].x+;
x=ans-len,y=len*(len-);
if(!x || Qs[i].x==Qs[i].y)
{A[Qs[i].id].x=,A[Qs[i].id].y=;continue;}
As=gcd(x,y);x/=As,y/=As;
A[Qs[i].id].x=x,A[Qs[i].id].y=y;
}
for(i=;i<=Q;i++)
printf("%lld/%lld\n",A[i].x,A[i].y);
return ;
}
莫队算法&BZOJ2038的更多相关文章
- BZOJ2038 小Z的袜子 (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- [BZOJ2038]小Z的袜子(莫队算法)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 分析:莫队算法 莫队算法是一种思想…… 处理问题:不带修改的区间询问 使用要求:[l-1 ...
- BZOJ-2038 小Z的袜子(hose) 莫队算法
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 5573 Solved: 2568 [Subm ...
- BZOJ2038: [2009国家集训队]小Z的袜子(hose) 莫队算法
要使用莫队算法前提 ,已知[l,r]的答案,要能在logn或者O(1)的时间得到[l+1,r],[l-1,r],[l,r-1],[l,r+1],适用于一类不修改的查询 优美的替代品——分块将n个数分成 ...
- BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 3577 Solved: 1652[Subm ...
- 莫队算法学习笔记【BZOJ2038:小Z的袜子】【SPOJ3267:D-query】
很久以前傻乎乎地看来源奇怪的资料的时候被各种曼哈顿弄晕了. 然后现在学会的是分块方法.另新创一个分块方法. 让我们考虑这样一个区间询问问题…… 它有如下的性质: 0,n个数,Q个询问. 1,它没有修改 ...
- [bzoj2038][2009国家集训队]小Z的袜子(hose)——莫队算法
Brief Description 给定一个序列,您需要处理m个询问,每个询问形如[l,r],您需要回答在区间[l,r]中任意选取两个数相同的概率. Algorithm Design 莫队算法入门题目 ...
- 【bzoj2038】[2009国家集训队]小Z的袜子(hose) 莫队算法
原文地址:http://www.cnblogs.com/GXZlegend/p/6803860.html 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终 ...
- [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 10299 Solved: 4685[Sub ...
随机推荐
- redis缓存机制【转载】
转载自:http://blog.csdn.net/acmman/article/details/53434134 redis的主从模式(1)介绍redis存储数据是在内存中运行的,运行速度比关系型数据 ...
- Java 读取Excel数据——POI-3.11 XSSF
POI - the Java API for Microsoft Documents 1.在Apache官网下载Apache最新poi版本:poi-bin-3.11-20141221.zip,解压: ...
- Java并发案例04---Future和 FutureTask
4.Future和 FutureTask 4.1 Future是Callable的返回结果. 它有三个功能 1.判断任务是否完成 2.能够中断任务 3.能够获取任务返回结果 4.2 FutureTas ...
- PHP imagechar() 图形验证码 字体太小问题
bool imagechar ( resource $image , int $font , int $x , int $y , string $c , int$color ) imagechar() ...
- javascrict中innerhtml和innerText的关系
1.time.innerHTML 就是id为time的标签中所有包含的代码内容 比如 <div id='time'><a href='#'>time</a>< ...
- SpringMVC DELETE,PUT请求报错 添加支持Http的DELETE、PUT请求
SpringMVC删除与修改操作需要用DELETE,PUT请求方式提交. 但要知道浏览器form表单只支持GET与POST请求,而DELETE.PUT等method并不支持. spring3.0添加了 ...
- I、Q信号是如何产生的,I、Q信号复用的作用
接收机在中频部分实现模数变换和采样,采样后的信号和数字域的同频相乘,就可以得到基带的I.Q分量.在无线接口传输时,每一种使用特定的载波频率.码(扩频码和扰码)以及载波相对相位(I或Q)的信道都可以理解 ...
- 【Linuc-CentOS 】通过yum安装 指定版本的nodejs
原 [Linuc-CentOS ]通过yum安装 指定版本的nodejs 2018年06月21日 06:56:32 黑夜的风 阅读数:884 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- 404 Note Found 队-Alpha1
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- ASP.NET MVC & WebApi 中实现Cors来让Ajax可以跨域访问 (转载)
什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...