莫队算法是一种针对询问进行分块的离线算法,如果已知区间 [ l , r ] 内的答案,并且可以在较快的时间内统计出区间 [ l-1, r ],[ l , r+1 ] 的答案,即可使用莫队算法。

莫队复杂度证明如下:

假设有 \(O(\sqrt n)\) 个询问在不同块(块与块的间隔处)中,有 \(O(\sqrt n)\) 个询问在同一个块中。

  1. 在同一个块中的所有询问,询问结束之后 l 至多移动 \(O(\sqrt n)\) 次,而 r 至多移动 \(O(n)\) 次,一共有 \(O(\sqrt n)\) 个块,因此这部分时间复杂度为\(O(n\sqrt n)\)。
  2. 若 q[i] 与 q[i+1] 在不同(相邻)块中,则询问之间的 l 至多移动 \(2O(\sqrt n)\) 次,而 r 至多移动 \(O(n)\) 次,一共有 \(O(\sqrt n)\) 个这样的询问,因此这部分时间复杂度也为\(O(n\sqrt n)\)。
  3. 综上所述,时间复杂度为\(O(n\sqrt n)\)。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10; struct node{int l,r,id,b;}q[maxn];
int n,m,size,cnt[maxn],a[maxn];
long long ans1[maxn],ans2[maxn]; bool cmp(const node& x,const node& y){return x.b==y.b?x.r<y.r:x.b<y.b;} void read_and_parse(){
scanf("%d%d",&n,&m);
size=(int)sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].b=(q[i].l-1)/size+1;
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
} long long gcd(long long x,long long y){return y?gcd(y,x%y):x;} void solve(){
for(int i=1,lp=1,rp=0,now=0;i<=m;i++){
while(lp<q[i].l)now-=2*cnt[a[lp]]-2,--cnt[a[lp]],++lp;
while(rp>q[i].r)now-=2*cnt[a[rp]]-2,--cnt[a[rp]],--rp;
while(lp>q[i].l)--lp,now+=2*cnt[a[lp]],++cnt[a[lp]];
while(rp<q[i].r)++rp,now+=2*cnt[a[rp]],++cnt[a[rp]];
if(q[i].l^q[i].r)ans1[q[i].id]=(long long)now,ans2[q[i].id]=(long long)(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
else ans1[q[i].id]=0,ans2[q[i].id]=1;
}
long long com;
for(int i=1;i<=m;i++)com=gcd(ans1[i],ans2[i]),printf("%lld/%lld\n",ans1[i]/com,ans2[i]/com);
} int main(){
read_and_parse();
solve();
return 0;
}

【bzoj2038】小Z的袜子的更多相关文章

  1. BZOJ2038 小Z的袜子 (莫队算法)

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...

  2. BZOJ-2038 小Z的袜子(hose) 莫队算法

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 5573 Solved: 2568 [Subm ...

  3. BZOJ2038小Z的袜子(hose)

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

  4. Bzoj2038 小Z的袜子(hose)

    Time Limit: 20000MS   Memory Limit: 265216KB   64bit IO Format: %lld & %llu Description 作为一个生活散漫 ...

  5. bzoj2038 小z的袜子 (莫队)

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

  6. BZOJ2038 小Z的袜子 莫队

    BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...

  7. [国家集训队][bzoj2038] 小Z的袜子 [莫队]

    题面: 传送门 思路: 又是一道标准的莫队处理题目,但是这道题需要一点小改动:求个数变成了求概率 我们思考:每次某种颜色从i个增加到i+1个,符合要求的情况多了多少? 原来的总情况数是i*(i-1)/ ...

  8. 【填坑向】bzoj2038小Z的袜子 莫队

    学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...

  9. bzoj2038小z的袜子

    用平面曼哈顿距离最小生成树或者莫队算法都可以吖QwQ~ 然而显然后者更好写(逃~) 莫队怎么写就看图吧QwQ~ 话说我一开始没开long long然后拍了3000组没拍出错交上去Wa了QAQ #inc ...

  10. BZOJ2038 小z的袜子

    题意:给一些数,然后每次询问一段区间,问从这个区间中抽走两个数,抽到相同的数的概率 正解:莫队算法 今天新学习了莫队算法,感觉好神,离线的询问好像都可以用莫队. 要不是坑爹的HNOI2016考了两道莫 ...

随机推荐

  1. sql 某字段存储另一个表的多个id值并以逗号分隔,现根据id去中文并拼接同样以逗号分隔

    首先介绍用到的两个函数 charindex(要查找的表达式1,表达式2),返回值为表达式1在表达式2中的下标,未找到则返回0.(sql的下标是从1开始的),例如 select charindex('s ...

  2. Vue 回顾之指令(关于input自动聚焦的问题)

    用了Vue也一年多了,虽然对大部分内容都比较熟悉,但有些用法可能会起到意想不到的作用. 今天在做一个关于抽奖的需求,要求是每次点击编辑按钮显示编辑框,要求自动聚焦. 一开始想到了autofocus属性 ...

  3. Wannafly挑战赛25 A.因子

    传送门 [https://www.nowcoder.com/acm/contest/197/A] 题意 给你n,m,让你求n!里有多少个m 分析 看这个你就懂了 [https://blog.csdn. ...

  4. 个人作业Week1

    一.<构建之法>提问 1.需求是什么?需求的规范需要明确吗? 2.一个人开发效率非常高,多人开发,个人效率随团队人数上升而直线下降,我们一般需要将大项目拆为小项目,使协作耦合产生的效率负影 ...

  5. Neo4j初探

    neo4j-desktop-win64 exe https://neo4j.com/download-thanks-desktop/?edition=desktop&flavour=winst ...

  6. PHP MySql增删改查

    mysql_connect()连接数据库 mysql_select_db选择数据库 mysql_fetch_assoc()获取结果集 mysql_query()执行sql语句 实例如下: <?p ...

  7. hive数据导入Sqoop工具

    下载Sqoop ,直接解压缩;然后导入2个环境变量 1.导入oracle数据库中表emp的数据到hive表中 1.导入到HDFS中 $ sqoop import --connect jdbc:mysq ...

  8. python下划线

    单下划线(_) 通常情况下,会在以下3种场景中使用: 1.在解释器中:在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器 ...

  9. jmeter创建高级测试计划

    如果应用程序使用重写地址而不是使用cookie存储信息,需要做一些额外的工作去测试程序 为了正确的响应重写地址,jmeter 需要解析 从服务器获取html 并且检索会话ID, 1 合理利用pre-p ...

  10. python之设置控制台字体颜色

    # 设置控制台输出字体颜色 # 格式:\033[显示方式;前景色;背景色m # 采用终端默认设置:\033[0m # 红色字体 print('\033[1;31m') print('*' * 10) ...