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的询问(莫队)的更多相关文章

  1. 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 ...

  2. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  3. 洛谷P2709 小B的询问 莫队做法

    题干 这个是用来学莫队的例题,洛谷详解 需要注意的一点,一定要分块!不然会慢很多(直接TLE) 其中分块只在排序的时候要用,并且是给问题右端点分块 再就是注意add与del函数里的操作,增加数量不提, ...

  4. 洛谷P2709 小B的询问 莫队

    小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小 ...

  5. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

  6. 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)

    题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...

  7. Bzoj 3781: 小B的询问 莫队,分块,暴力

    3781: 小B的询问 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 426  Solved: 284[Submit][Status][Discuss ...

  8. BZOJ3781:小B的询问(莫队)

    Description 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L ...

  9. 小B的询问 莫队分块

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

随机推荐

  1. 数据库的 ACID 属性

    ACID(Atomicity 原子性.Consistency 一致性.Isolation 隔离性.Durability 持久性)是一系列属性. 这些属性保证了数据库事物的可靠.在数据库中,对数据的一系 ...

  2. fb bin_debug下的swf不见了

    fb清理了所选的项目,如果代码有错误,会自动删除bin_debug目录下的swf.这种情况,构建项目是无法自动生成swf的,只有将代码报错的地方修改正错了.选构建项目才会在bin_debug目录下生成 ...

  3. ubuntu编译安装php7, 安装openssl

    sudo apt-get install openssl sudo apt-get install libssl-dev

  4. UI5-文档-4.1-Hello World!

    如你所知,SAPUI5是关于HTML5的.让我们开始构建第一个仅使用HTML的“Hello World”. Preview 浏览器显示文本“Hello World” Coding 你可以在此查看和下载 ...

  5. Jsonlib 属性过滤器

    /** * @title JSON转换属性过滤器 * @description 用于JSON lib的JSON转换 * @author maohuidong * @date 2017-04-06 */ ...

  6. UNION会自动删除重复项,union与union all的差异

    UNION会自动删除重复项,刷选出部分字段的时候要注意了,如果刷选出来的两个字段的值完全相同就会剩下一个. UNION ALL 和 UNION 不同之处在于 UNION ALL 会将左右两个查询的结果 ...

  7. 利用 setInterval 确定用户的动作是否停止

    最近遇到一个问题,对于某一个持续的动作,希望能够知晓用户何时停止这个动作, 比如说 我们通过注册onresize事件,去监听浏览器窗口变化的事件,在这个事件里面,我们可能要执行大量的计算去确定窗口变化 ...

  8. Delphi 创建一个url网址快捷方式代码

    procedure CreateURLShortcut(const ShortcutFile, URL: string); var F: TextFile; // text file begin {$ ...

  9. oracle老是出现监听错误

    解决方法之一: 点击开始-->选择程序--->选中你安装的oracle版本-->选中配置与移植工具-->选中Net Configuration Assistant-->在 ...

  10. MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能

    各班级学生成绩测试表 select * from TMP_A; 实现目的: 按照班级分类后按照分数倒序排序 采用MySQL变量简单实现,SQL如下: SELECT  a.stu_id,a.point, ...