今天来学了下莫队…这题应该就是这个算法的出处了

一篇别人的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的袜子-莫队算法的更多相关文章

  1. BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...

  2. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  3. BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】

    BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...

  4. BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 3577  Solved: 1652[Subm ...

  5. [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10299  Solved: 4685[Sub ...

  6. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  7. [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队

    小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...

  8. BZOJ2038: [2009国家集训队]小Z的袜子(hose)

    Time Limit: 20 Sec  Memory Limit: 259 MB Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天, ...

  9. bzoj2038: [2009国家集训队]小Z的袜子(hose) [莫队]

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

随机推荐

  1. 2020阿里Java面试题目大汇总,看看你离阿里还有多远,附答案!

    前言 首先说一下情况,我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿 ...

  2. 全网最全!这份深入讲解jdk和jvm原理的笔记,刷新了我对JVM的认知

    前言 前两天和朋友探讨技术的时候有聊到JVM和JDK这一块,聊到这里两个人就像高山流水遇知音那是根本停不下来,事后我想着趁现在印象还比较深刻就把这些东西整理起来分享给大家来帮助更多的人吧.话不多说,满 ...

  3. FL Studio里一起安装的ASIO4ALL有什么用?

    在我们安装FL Studio时,正常情况下我们安装FL Studio时最多也就改改安装目录,其他的安装设置一般不会动,但看到FL安装的那些东西我们难道不会感到好奇吗?FL Studio安装包括FL S ...

  4. ELK---- Elasticsearch 使用ik中文分词器增加拓展热词

    进入到我们ik分词器安装目录下的config目录 cd /usr/local/myapp/elasticsearch-6.4.3/plugins/ik/configvi IKAnalyzer.cfg. ...

  5. python截取视频制作动态表情包+文字

    1:安装moviepy库 2:安装IPython库 代码如下: from moviepy.editor import * from IPython.display import Image def B ...

  6. LeetCode周赛#203 题解

    1561. 你可以获得的最大硬币数目 #贪心 题目链接 题意 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续). Alice 将会 ...

  7. 这几个很实用的Linux命令,千万别忘记了!

  8. FPGA 串口

    VerilogHDL那些事儿_建模篇(黑金FPGA开发板配套教程) 作者:akuei2 说明:参照该书将部分程序验证学习一遍 学习时间:2014年5月3号 主要收获: 1. 对串口有初步了解: 2. ...

  9. form 表单上传文件及传输数据的编码格式

    form中的 action  控制请求往什么地方提交 method  请求方式 如果不写默认是get 请求 如果想传文件 必须要把默认的urlencoded的改成enctype="multi ...

  10. 区块链学习7:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名

    ☞ ░ 前往老猿Python博文目录 ░ 在Hyperledger Fabric区块链中,有背书节点进行背书,Hyperledger Fabric 使用背书策略来定义哪些节点需要执行交易. Hyper ...