[日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法
今天来学了下莫队…这题应该就是这个算法的出处了
一篇别人的blog:https://www.cnblogs.com/Paul-Guderian/p/6933799.html
题意:一个序列,$m$次询问:求区间$[l,r]$内随机选出两条袜子(不放回去)颜色相同的概率,保留最简分数,$m,n,col \leq 50000$
对于一个询问$[l,r]$,分母为$(r-l+1)*(r-l)$,分子为$\sum_{i} (sum[col[i]])^2-(r-l+1)$,其中$sum[col[i]]$表示当前区间里颜色为$col[i]$的袜子的总数,由于不放回去我们还要减掉$r-l+1)$,于是$ans_{l,r}=\frac{\sum_{i} sum[col[i]] - (r-l+1)}{(r-l+1)*(r-l)}$
暴力统计$O(nm)$光荣TLE~
先脑补一下线段树,颜色范围太大存不下,然后好像我们没有什么办法了。
好了我编不下去了,这里直接请出我们的主角:莫队算法
我们发现如果已经得到一个区间$[l,r]$的答案可以$O(1)$算出$[l-1,r],[l+1,r],[l,r-1],[l,r+1]$的答案,重排下询问顺序可以做到$O(n \sqrt{n})$的复杂度。
具体的上面那篇blog里已经说的很详细了。
嗯代码。
其实一开始的$[l,r]$只要$r=l-1$就行了(刚好是空区间),所以我这里直接选第一个要解决的询问了
#include<cstdio>
#include<cmath>
#include<algorithm>
#define rep(i,n) for(register int i=1;i<=n;i++)
using namespace std;
typedef long long lint;
const int N=50005;
inline int read()
{
int s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return s*f;
}
struct query
{
lint l,r,a,b,idx;
}q[N];
int n,m,block,s;
int belong[N],col[N],sum[N]; inline bool cmp1(const query &x,const query &y)
{
if(belong[x.l]==belong[y.l])return x.r<y.r;
return x.l<y.l;
}
inline bool cmp2(const query &x,const query &y)
{
return x.idx<y.idx;
}
inline lint gcd(lint a,lint b){return !b?a:gcd(b,a%b);}
inline lint sqr2(lint x){return x*x;}
inline void modify(int x,int v)
{
s-=sqr2(sum[col[x]]);sum[col[x]]+=v;s+=sqr2(sum[col[x]]);
}
int main()
{
n=read();m=read();block=(int)sqrt(n);
rep(i,n)col[i]=read(),belong[i]=i/block+1;
rep(i,m)q[i].l=read(),q[i].r=read(),q[i].idx=i;
sort(q+1,q+m+1,cmp1);
int l=q[1].l,r=l-1;
rep(i,m)
{
while(l<q[i].l)modify(l,-1),l++;
while(l>q[i].l)modify(l-1,1),l--;
while(r<q[i].r)modify(r+1,1),r++;
while(r>q[i].r)modify(r,-1),r--;
q[i].a=s-(r-l+1);
q[i].b=1ll*(r-l)*(r-l+1);
lint t=gcd(q[i].a,q[i].b);
q[i].a/=t;q[i].b/=t;
}
sort(q+1,q+m+1,cmp2);
rep(i,m)printf("%lld/%lld\n",q[i].a,q[i].b);
return 0;
}
[日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法的更多相关文章
- BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- BZOJ 2038 [2009国家集训队]小Z的袜子 莫队
2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...
- BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】
BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...
- 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 ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队
小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...
- BZOJ2038: [2009国家集训队]小Z的袜子(hose)
Time Limit: 20 Sec Memory Limit: 259 MB Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天, ...
- bzoj2038: [2009国家集训队]小Z的袜子(hose) [莫队]
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
随机推荐
- CA证书与https讲解
最近面试问到这个问题,之前了解过但答的不是很好,再补充补充一下https方面的知识. 备注:以下非原创文章. CA证书与https讲解 1.什么是CA证书. ◇ 普通的介绍信 想必大伙儿都听说过介绍信 ...
- 分享用MathType编辑字母与数学公式的技巧
利用几何画板在Word文档中画好几何图形后,接着需要编辑字母与数学公式,这时仅依靠Word自带的公式编辑器,会发现有很多公式不能编辑,所以应该采用专业的公式编辑器MathType,下面就一起来学习用M ...
- Jenkins中如何自定义构造结果
jenkis中的触发邮件机制是根据构建成功与否来发邮件,实际上我们在jenkis上定时执行脚本时是需要根据用例的执行结果来触发邮件预警 本文讲叙如何根据用例的执行结果来触发邮件预警 1.在任务配置的b ...
- leetcode 33和 leetcode81
//感想: 1.对于这两题,我真的是做到吐,这篇博客本来是昨晚准备写的,但是对于这个第二题,我真的做到头痛,实在是太尼玛的吐血了,主要是我也是头铁,非要找到那个分界点. 2.其实之前在牛客网上做过非常 ...
- Java 滴IO系统
JAVA IO 流可以概括为 "两个对应,一个桥梁".两个对应指字节流(Byte Stream)和字符流(Char Stream)的对应,输入流和输出流的对应. 一个桥梁指从字节流 ...
- 好端端的数据结构,为什么叫它SB树呢?
大家好,今天给大家介绍一个很厉害的数据结构,它的名字就很厉害,叫SB树,业内大佬往往叫做傻叉树.这个真不是我框你们,而是它的英文缩写就叫SBT. SBT其实是英文Size balanced tree的 ...
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- 我与PHP,ULM和Vue.js不得不说的故事(一个放荡不羁与一个神神秘秘一个似曾相识,从入门到放弃记录第二章)
·关于UML(git) 究竟是命运在茫茫语言之中遇到了你,还是我的魅力让你向我奔涌而来.好吧都不是,我俩就像古代包办婚姻,被专业牢牢的绑在一起了,既然都是一条绳上的蚂蚱.我我们应该能体谅彼此的不容易, ...
- mysql事务原理以及锁
一.Innodb事务原理 1.什么是事务 a.事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. b.在数据库提交时,可以确保要 ...
- [MRCTF2020]Ezpop
题目: Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki ...