2018.07.01 洛谷小B的询问(莫队)
P2709 小B的询问
题目描述
小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。
输入输出格式
输入格式:
第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。
输出格式:
M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
输入输出样例
输入样例#1:
6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6
输出样例#1:
6
9
5
2
说明
对于全部的数据,1<=N、M、K<=50000
这是本蒟蒻第一次写莫队算法,但是由于题目太水,直接过掉。
这里简单说一下莫队算法吧。
莫队算法其实就是一种优雅的暴力,对于随机的数据,常规的暴力其实表现是不错的,但是常规的暴力并没有复杂度的保证,那么我们知道,常规的暴力最坏情况是O(1)" role="presentation" style="position: relative;">O(1)O(1)预处理,O(n)" role="presentation" style="position: relative;">O(n)O(n)查询,原因是询问区间的左右端点的移动次数没有保证,那么为了使它们的移动次数有保证,我们要借用分块的思想,将询问的左端点分块,让块的编号作为第一关键字,右端点作为第二关键字排序,这样在块内部每次移动最多O(sqrt(n))" role="presentation" style="position: relative;">O(sqrt(n))O(sqrt(n)),块与块之间每次最多也移动O(sqrt(n))" role="presentation" style="position: relative;">O(sqrt(n))O(sqrt(n)),因此我们处理询问的复杂度就有了保障。总时间复杂度为O(n∗sqrt(n))" role="presentation" style="position: relative;">O(n∗sqrt(n))O(n∗sqrt(n))。
这题的代码:
#include<bits/stdc++.h>
#define N 50005
using namespace std;
int n,m,k,sig,a[N],sum[N],cnt[N],tl=0,tr=0,ans=0;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans;
}
struct Node{int l,r,id,pos;}q[N];
inline bool cmp(Node a,Node b){return a.pos==b.pos?a.r<b.r:a.pos<b.pos;}
int main(){
n=read(),m=read(),k=read(),sig=sqrt(n);
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=m;++i)q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].pos=(q[i].l-1)/sig+1;
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r;
while(tl<ql){ans-=2*cnt[a[tl]]-1,--cnt[a[tl]],++tl;}
while(tl>ql){--tl,++cnt[a[tl]],ans+=2*cnt[a[tl]]-1;}
while(tr<qr){++tr,++cnt[a[tr]],ans+=2*cnt[a[tr]]-1;}
while(tr>qr){ans-=2*cnt[a[tr]]-1,--cnt[a[tr]],--tr;}
sum[q[i].id]=ans-1;
}
for(int i=1;i<=m;++i)printf("%d\n",sum[i]);
return 0;
}
2018.07.01 洛谷小B的询问(莫队)的更多相关文章
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- 洛谷P2709 小B的询问 莫队做法
题干 这个是用来学莫队的例题,洛谷详解 需要注意的一点,一定要分块!不然会慢很多(直接TLE) 其中分块只在排序的时候要用,并且是给问题右端点分块 再就是注意add与del函数里的操作,增加数量不提, ...
- 洛谷P2709 小B的询问 莫队
小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小 ...
- Bzoj2120/洛谷P1903 数颜色(莫队)
题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...
- 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)
题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...
- Bzoj 3781: 小B的询问 莫队,分块,暴力
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 284[Submit][Status][Discuss ...
- BZOJ3781:小B的询问(莫队)
Description 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L ...
- 小B的询问 莫队分块
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
随机推荐
- WMI 连接远程计算机并进行局域网进程扫描
On Error Resume Next Dim myArray(231) myArray(0)="smss.exe"myArray(1)="csrss.exe" ...
- python中 cmp
python3.*版本中取消了数值之间的比较:cmp(x, y).取而代之的是 (x > y) - (x < y) 因为python中 false 为 0, true 为 1.
- 前端-javascript-正则表达式
1.概念 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- ADO数据库编程入门
ADO 是目前在Windows环境中比较流行的客户端数据库编程技术. ADO是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源.分布式的数据处理等 ...
- edgeR
1)简介 edgeR作用对象是count文件,rows 代表基因,行代表文库,count代表的是比对到每个基因的reads数目.它主要关注的是差异表达分析,而不是定量基因表达水平. edgeR wor ...
- eclipse JAVA反编译
前言:在实际的开发中几乎都会使用到一些框架来辅助项目的开发工作,对于一些框架的代码我们总怀有一些好奇之心,想一探究竟,有源码当然更好了,对于有些JAR包中的代码我们就需要利用反编译工具来看一下了,下面 ...
- Android 最火开发框架 xUtils
xUtils简介 xUtils3 api变化较多, 已转至 https://github.com/wyouflf/xUtils3 xUtils 2.x对Android 6.0兼容不是很好, 请尽快升级 ...
- ispostback的使用
如果form表单属性里没有 runat="server"就不能使用ispostback因为不会生成__viewstate隐藏域
- SpringMVC入门(基于注解方式实现)
---------------------siwuxie095 SpringMVC 入门(基于注解方式实现) SpringMVC ...
- (重要)LRU cache
[抄题]: [思维问题]: 需要从任何位置访问某数字有没有(重要 ),返回其位置(不重要),所以用hashmap. 需要从任何位置删除,用linkedlist.最终二者结合,用linked hashm ...