莫队算法是一种针对询问进行分块的离线算法,如果已知区间 [ 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. DevOps知识地图实践指南

    DevOps知识地图   DevOps方法论的主要来源是Agile, Lean 和TOC, 独创的方法论是持续交付. DevOps经典图书: * <DevOps实践指南> * <持续 ...

  2. Mvc_model实体数据验证

    MVC提供了很方便的数据验证,只需要在model里加入相关的正则等,那么就会在前台里生成相关的验证脚本.需要引用两个js文件: jquery.validate.min.js jquery.valida ...

  3. Linux服务器更换主板后,网卡识别失败的处理方法

    1)现象说明公司IDC机房里的一台线上服务器硬件报警,最后排查发现服务器主板坏了,随即联系厂商进行更换主板,最后更换后,登录服务器,发现网卡绑定及ip信息都在,但是ip却ping不通了,进一步排查,重 ...

  4. 12.17 Daily Scrum

      Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             邓亚梅             美化搜索框UI. 美 ...

  5. 20135218 Linux 实践二 编译模块

    20135218 姬梦馨 1.编写模块代码 模块构造函数:执行insmod或modprobe指令加载内核模块时会调用的初始化函数.函数原型必须是module_init(),括号内是函数指针 模块析构函 ...

  6. 如何使squild服务只能使用自定义的端口号

    编辑配置文件: vim /etc/squid/squid.conf http_port  10000 使用 setsebool 命令来限制 squild 服务只能使用自定义的端口: setsebool ...

  7. react + dva + ant架构后台管理系统(一)

    一.什么是dva dva是蚂蚁金服推出的一个单页应用框架,对 redux, react-router, redux-saga进行了上层封装,没有引入新的概念,但是极大的程度上提升了开发效率: 二.安装 ...

  8. [区块链]POW 与POS

    POW:全称Proof ofWork,工作证明. 这是什么意思呢?就是说,你能获得多少货币,取决于你挖矿贡献的有效工作,也就是说,你电脑性能越好,分给你的矿就会越多,这就是根据你的工作证明来执行货币的 ...

  9. 解决问题的方法=>现象-->原因-->方案-->方案的优缺点

    解决问题的方法=>现象-->原因-->方案-->方案的优缺点

  10. python矩阵水平镜像

    方法1: label = label.T[::-1].transpose() 方法2: label = label[:,::-1] 方法3: 使用 numpy.fliplr https://docs. ...