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. WPF的ListBox中的RadioButton不能单选问题

    WPF不知道是微软故意弄的还是真的匆忙的推出的产品,在实际开发过程中有很多小问题解决很麻烦. 今天主要说一下ListBox中使用RadioButton的时候里面的RadioButton不能单选!居然成 ...

  2. radio组件

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. DotNetTextBox使用方法步骤

    对于使用这个控件的研究我是用4个小时的工作终于完成成功了 现在请允许我在这里和你讲讲这个控件的使用方法 第一首先要从百度或是谷歌里下载一个dotnetTextBox第三方控件在解压后里面有三个文件 分 ...

  4. Android 自学之表格布局 TableLayout

    表格布局(TableLayout),表格布局采用行.列的形式来管理UI组件,TableLayout并不需要明确的声明多少行,多少列,而是通过TableRow.其他组件来控制表格的行数和列数. 每次想T ...

  5. 2. shell之shell配置文件

    1. shell配置文件的位置 最常用的shell有sh和bash等,此处只讲sh和bash 1.1. sh(Bourne Shell)配置文件主要有两个,分别为每个用户主目录中的.profile文件 ...

  6. SQL 收缩数据库文件大小

    USE WebExam; GO ALTER DATABASE WebExam SET RECOVERY SIMPLE; GO -- 收缩文件到 1 MB. ); GO ALTER DATABASE W ...

  7. SQLServer获取最后插入的ID值SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较

    IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值.IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表. @@IDENTITY 返回为当前会话的所有作用 ...

  8. onActivityResult不被执行的问题。

    1.首先,返回的Activity必须使用startActivityForResult启动. 2.其次,在返回的Activity中必须保证setResult方法在finish方法之前执行,否则onAct ...

  9. 负载均衡集群中的session解决方案

    前言 在我们给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP.Python.Ruby还是Java,只要使用服务器保存Session,在做负载均衡时都需要考 ...

  10. MongoDB3.2版本与3.0版本写场景压力测试对比

    我们主要是为了测试journal对写操作性能的影响.分别测试了3.2版本,3.0版本在ramdisk,hdd上有journal,和没journal的情况. 发现一个很怪异的现象,3.2版本时候,随着y ...