3781: 小B的询问

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 196  Solved: 135
[Submit][Status]

Description

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

Input

第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。

Output

M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
 

Sample Input

6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6

Sample Output

6
9
5
2
 
 
  网上题解都说是莫队算法,但是当时脑子一抽写了个分块,然后就过了。。。
  询问离线,按照r值排序,对于出现个数大于sqrt(n)的直接暴力二分即可,而个数小于sqrt(n)的部分可以这样处理,由于1,4,9,16是数列1,3,5,7的前缀和,对于一个数字在pos出现,即在pos处+1,如果之前出现过,则在之前出现的位置都+2,统计区间和[l,r]即为当前询问答案,具体详见代码。
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
#define MAXN 50010
#define MAXB 300
typedef long long qword;
inline qword sqr(int x)
{
return (qword)x*x;
}
int a[MAXN];
int rcv[MAXN];
int prv[MAXN];
int tot[MAXN];
int vec[MAXB][MAXN];
int vpos[MAXN],topv=;
struct qur_t
{
int id,x,y;
qword ans;
}qur[MAXN];
bool cmp_y(qur_t q1,qur_t q2)
{
return q1.y<q2.y;
}
bool cmp_id(qur_t q1,qur_t q2)
{
return q1.id<q2.id;
}
int tarr[MAXN];
void Add_tarr(int pos,int v)
{
while (pos<MAXN)
{
tarr[pos]+=v;
pos+=pos&(-pos);
}
}
int Query_tarr(int pos)
{
int ret=;
while (pos)
{
ret+=tarr[pos];
pos-=pos&(-pos);
}
return ret;
} int main()
{
// freopen("input.txt","r",stdin);
// freopen("ouput.txt","w",stdout);
int x,y,z,n,m,t;
scanf("%d%d%d",&n,&m,&t);
for (int i=;i<=n;i++)
scanf("%d",a+i);
for (int i=;i<=n;i++)
{
prv[i]=rcv[a[i]];
rcv[a[i]]=i;
}
for (int i=;i<=n;i++)
tot[a[i]]++;
int bs=(int)sqrt(max(n,t))*;
for (int i=;i<=t;i++)
if (tot[i]>=bs)
vpos[i]=++topv;
for (int i=;i<=n;i++)
if (vpos[a[i]])
vec[vpos[a[i]]][++vec[vpos[a[i]]][]]=i;
for (int i=;i<=m;i++)
scanf("%d%d",&qur[i].x,&qur[i].y),qur[i].id=i;
sort(qur+,qur+m+,cmp_y);
int *it1,*it2;
for (int i=;i<=m;i++)
{
for (int j=;j<=topv;j++)
{
it1=lower_bound(&vec[j][],&vec[j][vec[j][]] + ,qur[i].x);
it2=upper_bound(it1,&vec[j][vec[j][]] + ,qur[i].y);
it2--;
qur[i].ans+=sqr((int)(it2-it1+));
}
}
int qnow=;
for (int i=;i<=n;i++)
{
if (!vpos[a[i]])
{
Add_tarr(i,);
x=prv[i];
while (x)
{
Add_tarr(x,);
x=prv[x];
}
}
while (qnow<=m && qur[qnow].y==i)
{
qur[qnow].ans+=Query_tarr(i)-Query_tarr(qur[qnow].x-);
qnow++;
}
}
sort(qur+,qur+m+,cmp_id);
for (int i=;i<=m;i++)
{
printf("%lld\n",qur[i].ans);
}
}
 

bzoj 3781: 小B的询问 分块的更多相关文章

  1. bzoj 3781 小B的询问——分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3781 非常经典的分块套路.于是时间空间比大家的莫队差了好多…… #include<io ...

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

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

  3. BZOJ 3781: 小B的询问

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

  4. 洛谷P2709 BZOJ 3781 小B的询问 (莫队)

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

  5. 洛谷 P2709 BZOJ 3781 小B的询问

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求$\sum_1^Kc_i^2$的值,其中$c_i$表示数字i在[L..R]中的重复次数.小B请 ...

  6. 【模板】BZOJ 3781: 小B的询问 莫队算法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3781 N个数的序列,每次询问区间中每种数字出现次数的平方和,可以离线. 丢模板: #include ...

  7. bzoj 3781 小B的询问 —— 莫队

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3781 就是莫队,左端点分块排序,块内按右端点排序,然后直接做即可. 代码如下: #inclu ...

  8. bzoj 3781 小B的询问(莫队算法)

    [题意] 若干个询问sigma{ cnt[i]^2 } cnt[i]表示i在[l,r]内的出现次数. [思路] 莫队算法,裸题. 一个cnt数组即可维护插入与删除. [代码] #include< ...

  9. BZOJ 3781: 小B的询问 [莫队]

    求区间每种颜色出现次数平方和 写裸题练手 #include <iostream> #include <cstdio> #include <algorithm> #i ...

随机推荐

  1. TCP/IP协议原理与应用笔记15:网络连接设备

    1. 网络连接设备: (1)转发器 Repeater/ 集线器 Hub (2)网桥 Bridge / 交换机 Switch (3)路由器 Router (4)网关 Gateway 2. 从通信角度看待 ...

  2. WPF在后台中写一个鼠标移入移出的操作

    在这个问题上我纠结了好久就是为了一个问题就是forebackground这个属性 lblPwd.Foreground = Brushes.Black;我以前一直以为是fontground这个属性可是我 ...

  3. LSJ_NHibernate第四章 MVC

    前言: MVC现在已经成为web开发的一个主流趋势了,还没用过的小伙伴,你们已经落伍了,这里我推荐一篇学习博客 玩转Asp.net MVC 的八个扩展点  代码完全开源,下载地址:https://gi ...

  4. Linux中tshark(wireshark)抓包工具使用方法详解

    在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析.最近才发现,原来wires ...

  5. /etc/resolv.conf文件详解

    大家好,今天51开源给大家介绍一个在配置文件,那就是/etc/resolv.conf.很多网友对此文件的用处不太了解.其实并不复杂,它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名 ...

  6. oracle 高版本导出低版本数据库并且导入到低版本数据的方法

    第一步:sqlplus system/egis@orcl as sysdba;  进入sqlplus (输入管理员用户名/密码@数据库密码) 第二步: create directory dumpdir ...

  7. Runtime 在IOS中的详细使用

    因为之前写东西的时候,都在未知笔记中,所有大家没有看到过我的文章,今天就开始使用博客园来进行和大家沟通.好了,废话不那么多了,转入正题.下面我把runtime 给大家介绍一下. ### 一.runti ...

  8. 定位相关-CLLocationManager的使用。

    #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewCont ...

  9. Java的云打印Lodop

        打印某一个网页上的内容我们都经常遇到过,比如网上申请港澳通行证时需要填写申请表,然后把申请表给打印出来.像这样的打印技术是怎么实现?这种打印可以通过一种叫云打印的插件来做,按我的理解云打印的技 ...

  10. 九度OJ 1118 数制转换

    题目地址:http://ac.jobdu.com/problem.php?pid=1118 题目描述: 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所能表达的范围之内.   ...