BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)
题目链接: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)(莫队算法模板)的更多相关文章
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)&&莫对算法
这里跟曼哈顿最小生成树没有太大的关系. 时间复杂度证明: [BZOJ2038 小Z的袜子 AC代码] 排序方式: 第一关键字:l所在的块: 第二关键字:r从小到大. #include<cstdi ...
- bzoj 2038: [2009国家集训队]小Z的袜子(hose) (莫队)
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 3577 Solved: 1652[Subm ...
- [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 10299 Solved: 4685[Sub ...
- BZOJ 2038: [2009国家集训队]小Z的袜子 (莫队)
题目传送门:小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...
- 【bzoj2038】[2009国家集训队]小Z的袜子(hose) 莫队算法
原文地址:http://www.cnblogs.com/GXZlegend/p/6803860.html 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终 ...
- BZOJ2038: [2009国家集训队]小Z的袜子(hose) 莫队算法
要使用莫队算法前提 ,已知[l,r]的答案,要能在logn或者O(1)的时间得到[l+1,r],[l-1,r],[l,r-1],[l,r+1],适用于一类不修改的查询 优美的替代品——分块将n个数分成 ...
随机推荐
- WAKE-WIN10-SOFT-软件-Matlab配置及工具箱
1Matlab 1,1Matlab下载,安装,配置,,, 1,2 2工具箱 2,1LibSVM 必应:https://www.bing.com/search?q=libsvm&qs=n& ...
- May 29th 2017 Week 22nd Monday
I figure life is a gift and I don't intend on wasting it. 我觉得生命是一份礼物,我不想浪费它. It seems that I didn't ...
- npm proxy设置网络代理 并使用taobao registry
npm config set https-proxy http://server:portnpm config set proxy http://server:port npm set registr ...
- ArcGIS Server 10 Java 版的Rest服务的部署方法
使用ArcGIS Server 10 Java版发布GIS服务,当使用ArcGIS Manager创建好服务后,然后打开“ArcGIS Services Directory”的链接时发现网页报出了找不 ...
- Android进阶笔记10:ListView篇之ListView显示多种类型的条目(item)
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...
- What is Thread
A thread is a fundamental unit of CPU utilization –a thread ID –a program counter –a register set –a ...
- Netbackup用于技术支持的问题报告(报障模版)
在与支持部门联系以报告问题之前,请填写以下信息. 日期: _________________________记录以下产品.平台和设备信息:■ 产品及其版本级别.■ 服务器硬件类型和操作系统级别.■ 客 ...
- refinedet网络结构
refinedet只预测4个层,并且只有conv6_1.conv6_2,没有ssd中的conv7.8.9 refinedet的4个层都只有1个aspect ratio和1个min_size,所以每层每 ...
- ffmpeg一些filter用法、以及一些功能命令
来源:http://blog.csdn.net/dancing_night/article/details/46776903 1.加字幕 命令:ffmpeg -i <input> -fil ...
- JS JavaScript实现杨辉三角
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ........ 观察这样的一组数,找出规律,用控制台输出这样规律的数 规律:这 ...