沉迷于文化的我N年没更blog了。。。(\(N \in (0,1)\))

然后回到机房就沉迷于 \(generals.io\) 无法自拔。。。QAQ

然后想打一遍splay(然后是LCT),然后放弃了。。。QAQ

只好学一学\(Brother Zi Duck\)巨佬早学过的莫队辣

%%%GZY

hzwer说的很清楚了qwq以下复述一遍

先蒯一点:

如果我们已知[l,r]的答案,能在O(1)时间得到[l+1,r]的答案以及[l,r-1]的答案,即可使用莫队算法。时间复杂度为O(n1.5)。如果只能在logn的时间移动区间,则时间复杂度是O(n1.5*log n)。

将这\(n\)个数分成\(s(s=\lfloor \sqrt{n} \rfloor)\)块,第i个在pos[i]块。

然后把询问区间按照pos[l]第一关键字,r第二关键字排序。均递增

然后每次暴力转移

为啥复杂度是对的呢???

首先n,m同阶,n=m。

有这样几种转移

块内转移:每块r是递增的,一块的所有转移r是O(n),l的转移是O(n0.5)。有n0.5块,所以所有r的转移复杂度是O(n1.5),l最多转移m次,复杂度也是O(n1.5)。

一块到下一块的转移:O(n),这样的转移只有O(n0.5)次,复杂度还是O(n1.5)。

所以复杂度就是O(n^1.5)

orz gzy

orz hzwer

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
#define il inline
#define vd void
#define rg register
#define int long long
il int gi(){
rg int x=0;rg bool flg=0;rg char ch=getchar();
while(!isdigit(ch)){if(ch=='-')flg=1;ch=getchar();}
while(isdigit(ch))x=x*10-'0'+ch,ch=getchar();
return flg?-x:x;
}
const int maxn=50001,maxm=maxn;
int c[maxn];
struct qq{int l,r,id,ans;}s[maxm];
int n,m,qt,pos[maxn],ans,tot[maxn];
il bool cmp(const qq&a,const qq&b){return (pos[a.l]^pos[b.l])?pos[a.l]<pos[b.l]:a.r<b.r;}
il bool cmp_(const qq&a,const qq&b){return a.id<b.id;}
il int sqr(const int&a){return a*(a-1);}
il int gcd(const int&a,int b){return b?gcd(b,a%b):a;}
main(){
freopen("hose.in","r",stdin);
freopen("hose.out","w",stdout);
n=gi(),m=gi(),qt=sqrt(n);
for(rg int i=1;i<=n;++i)pos[i]=(i-1)/qt+1;
for(rg int i=1;i<=n;++i)c[i]=gi();
for(rg int i=1;i<=m;++i)s[i].l=gi(),s[i].r=gi(),s[i].id=i;
sort(s+1,s+m+1,cmp);
s[0].l=s[0].r=1;tot[c[1]]=1;
for(rg int i=1,j;i<=m;++i){
for(j=s[i-1].l-1;j>=s[i].l;--j)ans-=sqr(tot[c[j]]),++tot[c[j]],ans+=sqr(tot[c[j]]);
for(j=s[i-1].r+1;j<=s[i].r;++j)ans-=sqr(tot[c[j]]),++tot[c[j]],ans+=sqr(tot[c[j]]);
for(j=s[i-1].l;j<s[i].l;++j)ans-=sqr(tot[c[j]]),--tot[c[j]],ans+=sqr(tot[c[j]]);
for(j=s[i-1].r;j>s[i].r;--j)ans-=sqr(tot[c[j]]),--tot[c[j]],ans+=sqr(tot[c[j]]);
s[i].ans=ans;
}
sort(s+1,s+m+1,cmp_);
int a,b,_gcd;
for(rg int i=1;i<=m;++i){
a=s[i].ans,b=(s[i].r-s[i].l+1)*(s[i].r-s[i].l);
_gcd=gcd(a,b);
printf("%lld/%lld\n",a/_gcd,b/_gcd);
}
return 0;
}

cogs1772 [国家集训队2010]小Z的袜子的更多相关文章

  1. AC日记——[国家集训队2010]小Z的袜子 cogs 1775

    [国家集训队2010]小Z的袜子 思路: 传说中的莫队算法(优雅的暴力): 莫队算法是一个离线的区间询问算法: 如果我们知道[l,r], 那么,我们就能O(1)的时间求出(l-1,r),(l+1,r) ...

  2. 洛谷 1775. [国家集训队2010]小Z的袜子

    1775. [国家集训队2010]小Z的袜子 ★★★   输入文件:hose.in   输出文件:hose.out   简单对比时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活 ...

  3. 数据结构(莫队算法):国家集训队2010 小Z的袜子

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

  4. [国家集训队2010]小Z的袜子

    ★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜 ...

  5. 1775. [国家集训队2010]小Z的袜子

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

  6. 【bzoj2038】[国家集训队2010]小Z的袜子 莫队

    莫队:就是一坨软软的有弹性的东西Duang~Duang~Duang~ 为了防止以左端点为第一关键字以右端点为第二关键字使右端点弹来弹去,所以让左端点所在块为关键字得到O(n1.5)的时间效率,至于分块 ...

  7. 「国家集训队」小Z的袜子

    「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...

  8. 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队

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

  9. [国家集训队][bzoj2038] 小Z的袜子 [莫队]

    题面: 传送门 思路: 又是一道标准的莫队处理题目,但是这道题需要一点小改动:求个数变成了求概率 我们思考:每次某种颜色从i个增加到i+1个,符合要求的情况多了多少? 原来的总情况数是i*(i-1)/ ...

随机推荐

  1. Python学习---IO的异步[tornado模块]

    tornado是一个异步非阻塞的WEB框架.它的异步非阻塞实际上就是用事件循环写的. 主要体现在2点: 1. 作为webserver可以接收请求,同时支持异步处理请求.Django只能处理完成上一个请 ...

  2. Linux ulimit命令详解

    ulimit 是一个计算机命令,用于shell启动进程所占用的资源,可用于修改系统资源限制 命令常用参数 -H 设置硬资源限制. -S 设置软资源限制. -a 显示当前所有的资源限制. -c size ...

  3. 心情烦闷annoying,贴几个图!唉!annoying

    nothing could be more annoying!!!!! lost!failed!

  4. Hadoop学习之路(十三)MapReduce的初识

    MapReduce是什么 首先让我们来重温一下 hadoop 的四大组件: HDFS:分布式存储系统 MapReduce:分布式计算系统 YARN:hadoop 的资源调度系统 Common:以上三大 ...

  5. virtualbox+vagrant学习-2(command cli)-15-vagrant resume命令

    Resume 格式: vagrant resume [vm-name] 这将恢复先前挂起的vagrant托管计算机,可能与suspend命令一起使用. 默认情况下,配置的预配置程序在运行该命令时将不再 ...

  6. Python之Pulsar框架使用

    本文内容主要包含Pulsar的介绍和安装.初步使用.应用.常见示例等. 一. 介绍和安装 Pulsar是Python事件驱动并发框架:Pulsar具有高扩展性.高可用性的框架,它能够基于事件驱动的开源 ...

  7. Docker实战(五)之端口映射与容器互联

    除了网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问. 1.端口映射实现访 ...

  8. js 操作字典

    有时候我们进行ajax请求的时候,列表并不满足我们需求,有时候需要 key :value形式. 如果还按照python的定义: var data={}; data[tag_id][tag_ch_id] ...

  9. Elasticsearch之如何合理分配索引分片

    大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片? 在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如 ...

  10. spring MVC 后台token防重复提交解决方案

    看到公司有个部门提出了这个问题,补个粗略的解决方案... 1.编写拦截器 /** * Description: 防止重复提交 * * @Author liam * @Create Date: 2018 ...