题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038

解题心得:

  • 第一次接触莫队算法,很神奇,很巧妙。莫队算法主要就是用来解决多次询问时维护区间内的信息。维护区间信息第一个想法肯定是线段树,但是线段树维护的区间信息量很少(如最大值,最小值,SUM,GCD等),接触过尺取法的人都知道有时候在处理区间询问的时候可以先将区间排序然后再尺取。莫队算法也用了类似的思维,先对询问区间进行排序,这里排序就用了分块的思想,并不是严格的按照左端点,或者右端点排序,更多的是按照分的块进行排序,这样就减少了维护区间的大幅度乱跳动。
  • 莫队的复杂度分析,每个块长度unit为sqrt(n),如果l端点不在同一个块内需要移动到另一个块内,移动次数最多为2*unit,l在一个块内,r所在位置无法确定,但是排序后可以保证是单调递增的,所以最多移动n次,总共有n/unit个块,最坏要移动n/unit个块,所以总的最坏的复杂度是O(n * sqrt(n) + n * n /sqrt(n) )
  • 这个题来说算概率还是简单的 (Sum(每种袜子个数 2 ) - (r - l + 1)) / ((r - l + 1) * (r - l)),分母可以O(1)内得到,分子可以使用莫队维护
/**************************************************************
Problem: 2038
User: swust5120164059
Language: C++
Result: Accepted
Time:3404 ms
Memory:7560 kb
****************************************************************/ //
// ┏┛ ┻━━━━━┛ ┻┓
// ┃       ┃
// ┃   ━   ┃
// ┃ ┳┛  ┗┳ ┃
// ┃       ┃
// ┃   ┻   ┃
// ┃       ┃
// ┗━┓   ┏━━━┛
// ┃   ┃ 神兽保佑
// ┃   ┃ 代码无BUG!
// ┃   ┗━━━━━━━━━┓
// ┃        ┣┓
// ┃     ┏┛
// ┗━┓ ┓ ┏━━━┳ ┓ ┏━┛
// ┃ ┫ ┫ ┃ ┫ ┫
// ┗━┻━┛ ┗━┻━┛
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+; struct NODE {
ll l, r, A, B, pos;
}q[maxn]; ll n, m, color[maxn], B[maxn], cnt_color[maxn]; void init() {
scanf("%lld%lld",&n,&m);
ll div = (ll) sqrt(n);
for(int i=;i<=n;i++) {
scanf("%lld", &color[i]);
B[i] = i/div + ;
}
for(int i=;i<m;i++) {
scanf("%lld%lld",&q[i].l, &q[i].r);
q[i].pos = i;
}
} bool cmp1(NODE a, NODE b) {
if(B[a.l] == B[b.l])
return a.r < b.r;
return a.l < b.l;
} bool cmp2(NODE a, NODE b) {
return a.pos < b.pos;
} ll ans = ;
void add(ll pos, ll va) {
ans -= pow(cnt_color[color[pos]], );
cnt_color[color[pos]] += va;
ans += pow(cnt_color[color[pos]], );
} int main() {
init();
sort(q, q+m, cmp1);
int l = , r = ;
for(int i=;i<m;i++) {
//左右端点跳转
while(l < q[i].l)
add(l++, -);
while(l > q[i].l)
add(--l, );
while(r < q[i].r)
add(++r, );
while(r > q[i].r)
add(r--, -); //只有一个袜子概率为0
if(q[i].l == q[i].r) {
q[i].A = ;
q[i].B = ;
continue;
}
q[i].A = ans - (q[i].r - q[i].l + );
q[i].B = (q[i].r - q[i].l + ) * (q[i].r - q[i].l);
}
sort(q, q+m, cmp2);
for(int i=;i<m;i++) {
ll GCD = __gcd(q[i].A, q[i].B);
printf("%lld/%lld\n", q[i].A/GCD, q[i].B/GCD);
}
return ;
}

BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)的更多相关文章

  1. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

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

  2. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

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

  3. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)&&莫对算法

    这里跟曼哈顿最小生成树没有太大的关系. 时间复杂度证明: [BZOJ2038 小Z的袜子 AC代码] 排序方式: 第一关键字:l所在的块: 第二关键字:r从小到大. #include<cstdi ...

  5. bzoj 2038: [2009国家集训队]小Z的袜子(hose) (莫队)

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

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

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

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

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

  8. BZOJ 2038: [2009国家集训队]小Z的袜子 (莫队)

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

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

    原文地址:http://www.cnblogs.com/GXZlegend/p/6803860.html 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终 ...

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

    要使用莫队算法前提 ,已知[l,r]的答案,要能在logn或者O(1)的时间得到[l+1,r],[l-1,r],[l,r-1],[l,r+1],适用于一类不修改的查询 优美的替代品——分块将n个数分成 ...

随机推荐

  1. mif文件C语言生成

    1:正弦波 用函数 sin (x * π/180°) /************************************************** 正弦波 mif 生成 ********** ...

  2. March 16 2017 Week 11 Thursday

    Adventure may hurt you, but monotony will kill you. 也许冒险会让你受伤,但一成不变会让你灭亡. The very theme of the univ ...

  3. 长大DeepMind第一次团队作业

    1.队名 长大DeepMind 2.队员风采 学号 姓名 擅长的技术 编程的兴趣点 希望承担的角色 一句话宣言 B20150304508 晏司举 JAVA,ssm框架,MySQL数据库 JAVA后台服 ...

  4. python 带BOM头utf-8的响应解码

    接口响应编码格式为带BOM头utf-8.直接获取响应的text出现乱码. '''dinghanhua2018-11requests text与content,指定响应的encoding''' api ...

  5. c++ 单引号和双引号

    c++中单引号表示一个字符,双引号表示字符串 python中单引号与双引号是一样的

  6. ueditor1.2.6图片被压缩的解决办法

    修改文件路径: ueditor\dialogs\image\image.html 修改数值:

  7. MVC5 Attribute(特性)

    AuthorizeAttribute:一般用来判断权限 ActionFilterAttribute:方法执行前后动作 OutputCacheAttribute:输出缓存设置 注:我们创建名称的时候请带 ...

  8. AngularJS 使用 even 和 odd 表格

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. 表达式过滤器currency

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. webpack的基本配置和一些理解

    最近花了两周的休息时间学习了webpack,能够可以编写自己项目所需要的配置文件,总体来说webpack是一种非常优秀的前端模块化的打包工具,非常值得花时间来研究学习. 什么是webpack,它的出现 ...