[国家集训队][bzoj2038] 小Z的袜子 [莫队]
题面:
思路:
又是一道标准的莫队处理题目,但是这道题需要一点小改动:求个数变成了求概率
我们思考:每次某种颜色从i个增加到i+1个,符合要求的情况多了多少?
原来的总情况数是i*(i-1)/2,现在是i*(i+1)/2,实际上就是增加了i个!
所以我们只要把对答案tot的更改变成加i即可
莫队学习请戳这里:莫队
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll n,m,cnt[],tot=,x[],curl,curr,block;
ll sqr[],ans[],bot[];
struct query{
ll l,r,i;
}a[];
bool cmp(query l,query r){
if(l.l/block!=r.l/block) return (l.l/block)<(r.l/block);
else return l.r<r.r;
}
void add(ll i){
cnt[x[i]]++;tot+=sqr[cnt[x[i]]]-sqr[cnt[x[i]]-];
//cout<<"add "<<i<<" "<<x[i]<<" "<<cnt[x[i]]<<"\n";
}
void erase(ll i){
cnt[x[i]]--;tot+=sqr[cnt[x[i]]]-sqr[cnt[x[i]]+];
//cout<<"erase "<<i<<" "<<x[i]<<" "<<cnt[x[i]]<<"\n";
}
void init(){
for(ll i=;i<=n;i++) sqr[i]=i*(i-);
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int main(){
ll i;ll tmp,t1,t2;
n=read();m=read();for(i=;i<=n;i++) x[i]=read();block=sqrt(n);
init();
for(i=;i<=m;i++) a[i].l=read(),a[i].r=read(),a[i].i=i;
sort(a+,a+m+,cmp);curl=a[].l;curr=a[].r;
for(i=a[].l;i<=a[].r;i++) add(i);
ans[a[].i]=tot;bot[a[].i]=(a[].r-a[].l)*(a[].r-a[].l+);
if(a[].l==a[].r) bot[a[].i]=;
for(i=;i<=m;i++){
while(curl<a[i].l) erase(curl++);
while(curl>a[i].l) add(--curl);
while(curr<a[i].r) add(++curr);
while(curr>a[i].r) erase(curr--);
ans[a[i].i]=tot;bot[a[i].i]=(a[i].r-a[i].l)*(a[i].r-a[i].l+);
if(a[i].l==a[i].r) bot[a[i].i]=;
//cout<<"now "<<tot<<" "<<a[i].l<<" "<<a[i].r<<"\n";
}
for(i=;i<=m;i++){
if(ans[i]==) printf("0/1\n");
else{
tmp=gcd(bot[i],ans[i]);
//cout<<"gcd "<<tmp<<" "<<ans[i]<<" "<<bot[i]<<"\n";
t1=ans[i]/tmp;t2=bot[i]/tmp;
printf("%lld/%lld\n",t1,t2);
}
}
}
[国家集训队][bzoj2038] 小Z的袜子 [莫队]的更多相关文章
- 【bzoj2038】[国家集训队2010]小Z的袜子 莫队
莫队:就是一坨软软的有弹性的东西Duang~Duang~Duang~ 为了防止以左端点为第一关键字以右端点为第二关键字使右端点弹来弹去,所以让左端点所在块为关键字得到O(n1.5)的时间效率,至于分块 ...
- BZOJ2038 小Z的袜子 莫队
BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...
- 【填坑向】bzoj2038小Z的袜子 莫队
学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...
- BZOJ2038 小Z的袜子(莫队之源)
题意+思路: 给你m个区间询问,问每个区间内的$\displaystyle \frac{\sum x^2-(R-L+1)}{(R-L)(R-L+1)} $,其中x为每种数字的个数,用cnt存储: 所以 ...
- AC日记——[国家集训队2010]小Z的袜子 cogs 1775
[国家集训队2010]小Z的袜子 思路: 传说中的莫队算法(优雅的暴力): 莫队算法是一个离线的区间询问算法: 如果我们知道[l,r], 那么,我们就能O(1)的时间求出(l-1,r),(l+1,r) ...
- 洛谷 1775. [国家集训队2010]小Z的袜子
1775. [国家集训队2010]小Z的袜子 ★★★ 输入文件:hose.in 输出文件:hose.out 简单对比时间限制:1 s 内存限制:512 MB [题目描述] 作为一个生活 ...
- 「国家集训队」小Z的袜子
「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...
- 小Z的袜子 & 莫队
莫队学习 & 小Z的袜子 引入 莫队 由莫涛巨佬提出,是一种离线算法 运用广泛 可以解决广大的离线区间询问题 莫队的历史 早在mt巨佬提出莫队之前 类似莫队的算法和莫队的思想已在Codefor ...
- BZOJ 2038 [2009国家集训队]小Z的袜子 莫队
2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...
随机推荐
- 【转】转自微信公众号 JavaScript 复杂判断的更优雅写法
与微信公众号看到一篇js复杂判断的文章,对我启发很大,故转到博客园以供后期不断学习并应用于项目.原文地址:https://mp.weixin.qq.com/s/ClFDRj4MnAxv1dJ5VWKS ...
- SpringBoot学习记录(二)
一. SpringBoot日志框架 SpringBoot:底层是Spring框架,Spring框架默认是用JCL(commons-logging): SpringBoot选用SLF4j和logback ...
- C#冒泡排序程序
考虑到很多面试可能会考察冒泡排序的用法,所以特地花时间厘清了一下思路.下面说一下我的思路:冒泡排序核心就是比较方法,冒泡排序的比较方法顾名思义就是像气泡一样,最大(或者最小)的数往上冒.普通比较几个数 ...
- react的Redux基础
redux的中文文档:http://www.redux.org.cn/ redux的英文官网:https://redux.js.org/ redux相当于vuex Redux 是 JavaScript ...
- SpringBoot之HelloWorld仔细分析
程序中的pom.xml文件: 一.父级标签 <parent> <groupId>org.springframework.boot</groupId> <art ...
- Spring Cloud学习介绍
最近在学spring cloud, 整理了下 简单知识要求: 1.要了解springboot 2.了解分布式架构 3.了解微服务 4.了解springcloud是做什么的 带着这些,初学者 就至少有个 ...
- python 实现无序列表
# -*- coding:utf-8 -*- class Node: def __init__(self, initdata): self.data = initdata self.next = No ...
- Java中的finally
基础用法: int f1() { try{ return 1; }finally { System.out.println("finall执行"); } } @Test publi ...
- 网站动态加载JS脚本
Demo_1 function loadJS(url, fn) { var ss = document.getElementsByName('script'), loaded = false; for ...
- vue 网页文字中带#的话题颜色高亮
网页中显示文字时,带#开始和结束的文字蓝色高亮,就像微博话题一样效果如下 html <span v-html="parseComments('#吃货节#有什么好吃的')"&g ...