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. Node NPM 的常用配置

    1,修改 npm 下载模块的 保存地址 <1>  进入 cmd 运行, 如下命令 npm config set prefix  "C:\Program File\NodeJs\p ...

  2. java ee7 -- Java Bean验证

    针对对象.对象成员.方法.构造函数的数据验证. 1. 一个验证的小例子 (1) 添加引用jar <dependency> <groupId>org.hibernate.vali ...

  3. vue基础——Class与Style绑定

    Class与Style绑定 操作元素的class列表和内联样式是数据绑定的一个常见的需求. 因为它们都是属性,所以我们可以用v-bind来处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼 ...

  4. NISP视频知识点总结

    身份认证访问控制安全审计本章实验 ===密码学=====古典密码 算法本身的保密性近代密码 机械密码\机电 密码打字密码机轮转机现代密码 基于密钥公钥密码 公钥==================对称 ...

  5. python爬虫(5)--正则表达式

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 1.了解正则表达式 正则表达式 ...

  6. Hibernate的一个问题object references an unsaved transient instance - save the transi5

    1 我做了一对多和多对一的双向关联关系,在User这一方@ManyToOne已经设置了级联Cascade,这样在测试程序中保存User时,Group也应该自动保存,为什么会抛出以下的异常: (我是按着 ...

  7. JAVA动态性之一一反射机制reflection

    package com.bjsxt.reflection.test.bean; public class User { private int id; private int age; private ...

  8. 电脑连接树莓派Pi Zero W

    作者:陈拓 chentuo@ms.xab.ac.cn 2018.05.16/2018.06.09 0.  概述 本位介绍两种电脑连接树莓派Pi Zero W的方法: 电脑通过USB以太网连接树莓派Ze ...

  9. console.log等不能打印全部数据/信息

    有时候console.log在chrome调试控制台打印不全,如下: 这个时候,我们可以点击进去:用watch 工具,添加变量,右击copy value 选项:

  10. cdoj第13th校赛初赛H - Hug the princess

    http://acm.uestc.edu.cn/#/contest/show/54 H - Hug the princess Time Limit: 3000/1000MS (Java/Others) ...