题目链接: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. 【Leetcode】【Easy】Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  2. 启动eclipse出现“Error opening registry key 'software\Javasoft\Java Runtime Environment'”

    启动eclipse出现“Error opening registry key 'software\Javasoft\Java Runtime Environment'”,“java was start ...

  3. Windows 2012R2远程桌面服务部署环境简介

    一.部署环境 服务器名 所属域 IP地址 服务器用途 备注 AD01 CONTOSO.COM 192.168.1.1 域控制器 采用Windows Server 2012 R2 Datacenter ...

  4. KVM虚拟化学习记录

    请查看我的有道云笔记: http://note.youdao.com/noteshare?id=ed7308eeb1ee675b406494f4ba042ba4&sub=047FD8C61BA ...

  5. TP5.0:跳转链接到某控制器下的某方法

    语法:{:url('控制器名/方法名')} 例如: 结果: 以上 END

  6. Java传引用问题

            Java传引用问题  使用Java调用方法时,可以传值,也可以传引用.下面说说两者的区别: 1.传值 传值中的"值"类型是指java的8大基本类型(基础知识,不知道 ...

  7. (String)、toString()与String.valueOf()的区别

    (String).Object.toString()正常情况下跟String.valueOf()没有区别. 但当Object是null的时候.toString会抛出异常.valueOf返回" ...

  8. C++11之std::future和std::promise和std::std::packaged_task

    为什么C++11引入std::future和std::promise?C++11创建了线程以后,我们不能直接从thread.join()得到结果,必须定义一个变量,在线程执行时,对这个变量赋值,然后执 ...

  9. 【BZOJ3784】树上路径

    题目大意 给定一个\(N\)个结点的树,结点用正整数\(1..N\)编号.每条边有一个正整数权值.用\(d(a,b)\)表示从结点\(a\)到结点\(b\)路边上经过边的权值.其中要求\(a < ...

  10. 基于Qt的相似QQ好友列表抽屉效果的实现

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shuideyidi/article/details/30619167     前段时间在忙毕业设计, ...