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;
}

最新文章

  1. Delphi 中的自动释放策略-转
  2. step by step设置postgresql用户密码并配置远程连接
  3. MSA:多重比对序列的格式及其应用
  4. thinkphp 3.2.3 连接sql server 2014 WAMPSERVER环境包
  5. C++虚函数、虚继承、对象内存模型(转)
  6. js原生的url操作函数,及使用方法。(附:下边还有jquery对url里的中文解码函数)
  7. [翻译]Understanding Weak References(理解弱引用)
  8. delegate事件绑定
  9. 验证码识别--type2
  10. C++将string转化成字符串数组
  11. 《学习OpenCV》练习题第四章第三题a
  12. GLSL实现HDR Rendering 【转】
  13. 转载: ABAP动态内表操作
  14. HDU-1114(背包DP)
  15. 学习javascript中this用法的一些感悟
  16. 本地搭建开发环境开发redis程序
  17. js数组练习
  18. 引用类型之object类型
  19. iOS多视图传值方式之通知传值(NSNotification;NSNotificationCenter)
  20. python调用数据库并查询

热门文章

  1. JS获取最终样式
  2. OTS parsing error: invalid version tag woff和ttf文件被Filter拦截
  3. 前端-HTML练习题
  4. WDA-FPM-2-APPLICATION-TABSTRIP(OIF)
  5. Axel与Wget下载工具
  6. 将Ctrl+Alt+Delete键进行屏蔽,防止误操作重启服务器
  7. 迷你MVVM框架 avalonjs 1.3.7发布
  8. 从给定字符串中截取n个字节的字符(解决汉字截取乱码问题)
  9. ubuntu 软件包系统已损坏 解决方法
  10. ArcGIS案例学习笔记3_2