BZOJ2038 小z的袜子
题意:给一些数,然后每次询问一段区间,问从这个区间中抽走两个数,抽到相同的数的概率
正解:莫队算法
今天新学习了莫队算法,感觉好神,离线的询问好像都可以用莫队。
要不是坑爹的HNOI2016考了两道莫队题,才不得不来入这个坑,A完这道题,就去A掉HNOI2016Day2的两道题。。。
把询问离线下来,然后按照左端点所在块的编号来排序,若在同一个块则以右端点编号排序(有点像分块)
然后我每次暴力处理一下一个询问,之后利用这一次的结果,往前或者往后拓展,把处在同一个块的全部都可以处理掉(期望复杂度:O(1))
最终可以达到O(N^1.5)的复杂度
复杂度证明的话,感觉yy一下可以想得到
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL;
const int MAXN = ;
const int MAXM = ;
int n,m;
int color[MAXN];
LL ans[MAXM];
int siz,zong;
LL size[MAXN];
LL num[MAXN];
//莫队算法 struct wen{
int l,r;
int jilu;
int k;//存储所在块的编号
}Q[MAXM]; inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} bool cmp(wen q,wen qq){ if(q.k==qq.k) return q.r<qq.r; return q.k<qq.k; }
//按照左端点所在块的编号来排序,若相等则以右端点编号为序 inline LL gcd(LL x,LL y) { return y==? x:gcd(y,x%y); } int main()
{
freopen("hose.in","r",stdin);
freopen("hose.out","w",stdout);
n=getint();m=getint();
for(int i=;i<=n;i++) color[i]=getint(); zong=sqrt(n); if(zong*zong==n) siz=zong; else siz=n/zong+; for(int i=;i<=m;i++) {
Q[i].l=getint(),Q[i].r=getint(),Q[i].jilu=i,size[i]=Q[i].r-Q[i].l+;
Q[i].k=(Q[i].l-)/siz+;
} sort(Q+,Q+m+,cmp);
int ljh=;
while(ljh<=m) {
int kuai=Q[ljh].k; memset(num,,sizeof(num)); for(int j=Q[ljh].l;j<=Q[ljh].r;j++) ans[Q[ljh].jilu]+=*(num[color[j]]++);
ljh++; for(;Q[ljh].k==kuai;ljh++) {
ans[Q[ljh].jilu]=ans[Q[ljh-].jilu];
for(int j=Q[ljh-].r+ ;j<=Q[ljh].r;j++) ans[Q[ljh].jilu]+=*(num[color[j]]++); if(Q[ljh].l>Q[ljh-].l) for(int j=Q[ljh-].l;j<Q[ljh].l;j++) ans[Q[ljh].jilu]-=*(--num[color[j]]);
else for(int j=Q[ljh].l;j<Q[ljh-].l;j++) ans[Q[ljh].jilu]+=*(num[color[j]]++);
}
} for(int i=;i<=m;i++) {
LL fenmu;
if(size[i]==) fenmu=;
else fenmu=size[i]*(size[i]-);
LL gong=gcd(fenmu,ans[i]);
printf("%lld/%lld\n",ans[i]/gong,fenmu/gong);
} return ;
}
BZOJ2038 小z的袜子的更多相关文章
- BZOJ2038 小Z的袜子 (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- BZOJ-2038 小Z的袜子(hose) 莫队算法
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 5573 Solved: 2568 [Subm ...
- BZOJ2038小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2343 Solved: 1077[Subm ...
- Bzoj2038 小Z的袜子(hose)
Time Limit: 20000MS Memory Limit: 265216KB 64bit IO Format: %lld & %llu Description 作为一个生活散漫 ...
- bzoj2038 小z的袜子 (莫队)
题目大意 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编 ...
- BZOJ2038 小Z的袜子 莫队
BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...
- [国家集训队][bzoj2038] 小Z的袜子 [莫队]
题面: 传送门 思路: 又是一道标准的莫队处理题目,但是这道题需要一点小改动:求个数变成了求概率 我们思考:每次某种颜色从i个增加到i+1个,符合要求的情况多了多少? 原来的总情况数是i*(i-1)/ ...
- 【填坑向】bzoj2038小Z的袜子 莫队
学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...
- bzoj2038小z的袜子
用平面曼哈顿距离最小生成树或者莫队算法都可以吖QwQ~ 然而显然后者更好写(逃~) 莫队怎么写就看图吧QwQ~ 话说我一开始没开long long然后拍了3000组没拍出错交上去Wa了QAQ #inc ...
随机推荐
- js checkbox 选中判断
var isSelect = ""; isSelect = $("#tblImgList" + " input[type='checkbox']&qu ...
- SQL Server 查询性能优化 相关文章
来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...
- 【点滴积累,厚积薄发】修改hosts,并刷新dns缓存
Windows系统下hosts位置 C:\Windows\System32\drivers\etc 修改hosts后,要想马上生效,需要运行命令来刷新DNS缓存:ipconfig /flushdns
- TinyFrame尾篇:整合Spring AOP实现用户认证
创建Manager用户验证表 这一篇主要讲解使用AOP对用户操作进行验证,如果通过验证,则继续执行,反之,则不能执行.其思想和上一篇完全一致. 由于需要用到用户认证,所以我们新建一个Manager实体 ...
- SQL 性能调优日常积累
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左 ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- 你的C#代码是怎么跑起来的(二)
接上篇:你的C#代码是怎么跑起来的(一) 通过上篇文章知道了EXE文件的结构,现在来看看双击后是怎样运行的: 双击文件后OS Loader加载PE文件并解析,在PE Optional Header里找 ...
- cocos2dx-2.2.1 免 Cygwin 环境搭建(Win8+VS2013+ADT Bundle+android-ndk-r9c)
1.下载 ADT Bundle 解压到D盘 D:\adt-bundle-windows-x86_64-20131030: 2.下载 NDK-R9C,解压到 ADT 目录下:D:\adt-bundle- ...
- 从Nodejs脚本到vue首页看开源始末的DemoHouse
最近上Github看见了大漠的DemoHouse项目,看到Issues说准备做一个首页,于是我的第一想法就是做一个md列表页面,md文件可以很容易的生成一个html文件.刚刚做好脚本文件,可以生成li ...
- 再次认识 vertical-align
css中的基础知识,上次在刷 segmentfault 遇见了一个相关的问题有再次看过 vertical-align 的描述.今天自己也遇见一个类似的问题,再次深入学习一下. vertical-ali ...