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. 在含有null值的复杂类的集合(Collection)中取最大值

    在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Clas ...

  2. Ubuntu上VNC 配置

    Ubuntu下VNC配置文章分类:操作系统通过将服务器配置成VNC SERVER,可以让其他主机使用图形方式登录这台服务器. 在ubuntu下配置vnc server很简单,方法如下: 服务器端: 1 ...

  3. iOS9.0之后不支持http请求解决方案

    打开info.plist文件,添加关键字 NSAppTransportSecurity 类型 Dictionary 在 NSAppTransportSecurity 下添加关键字 NSAllowsAr ...

  4. mysql mac 上启动

    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist 中内容: <string>/usr/local/o ...

  5. pat_1014

    1014. 福尔摩斯的约会 (20) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大侦探福尔摩斯接到一张奇怪的字 ...

  6. Asp.net笔记(原创)

    Repeater控件的使用:<asp:Label ID="Label1" runat="server" Text='<%#Eval("na ...

  7. PAT_1046 划拳

    啦啦啦.今天晚上火车回学校了.= =还是挺舍不得家里的. 题目描述: 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字 ...

  8. 九度OJ 1468 Sharing -- 哈希

    题目地址:http://ac.jobdu.com/problem.php?pid=1468 题目描述: To store English words, one method is to use lin ...

  9. processon完全装逼指南

    一.引言 作为一名IT从业者,不仅要有扎实的知识储备,出色的业务能力,还需要具备一定的软实力.软实力体现在具体事务的处理能力,包括沟通,协作,团队领导,问题的解决方案等,这些能力在关键时刻比硬性的技术 ...

  10. oracle所在磁盘空间不足导致了数据库异常

    oracle所在磁盘空间不足导致了数据库异常.需要减小数据文件的大小来解决. 1.检查数据文件的名称和编号 select file#,name from v$datafile; 2.看哪个数据文件所占 ...