洛谷P2709 小B的询问 莫队做法
需要注意的一点,一定要分块!不然会慢很多(直接TLE)
其中分块只在排序的时候要用,并且是给问题右端点分块
再就是注意add与del函数里的操作,增加数量不提,ans的加减可以用完全平方公式推出
上代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define NUM 50010
using namespace std;
int n,m,k;
long long ans,blo;//当前的答案,每个块内点的数量
int a[NUM];
long long sum[NUM],anss[NUM];//每个数的出现次数,对于每个问题的对应答案
struct wen{
long long l,r,num;
};
wen q[NUM];
void add( int x ){
sum[a[x]]++;
ans += sum[a[x]] * 2 - 1;
}
void del( int x ){
sum[a[x]]--;
ans -= sum[a[x]] * 2 + 1;
//a^2 = (a-1)^2+2a-1
}
bool cmp( wen gu1,wen gu2 ){
if( gu1.r/blo != gu2.r/blo ) return gu1.r < gu2.r;
return gu1.l < gu2.l;
}
int main(){
cin >> n >> m >> k;
for( int i = 1;i <= n;i++ )
cin >> a[i];
for( int i = 1;i <= m;i++ ){
cin >> q[i].l >> q[i].r;
q[i].num = i;
}
blo = sqrt(n);
sort( q+1,q+m+1,cmp );
long long l = 1,r = 0,ql,qr;
for( int i = 1;i <= m;i++ ){
ql = q[i].l;qr = q[i].r;
while( l < ql ){
del(l);
l++;
}
while( r > qr ){
del(r);
r--;
}
//因为add函数是从a^2 = (a-1)^2 + 2a -1,所以先位移再跑函数
while( l > ql ){
l--;
add(l);
}
while( r < qr ){
r++;
add(r);
}
anss[q[i].num] = ans;
}
for( int i = 1;i <= m;i++ )
cout << anss[i] << endl;
return 0;
}
洛谷P2709 小B的询问 莫队做法的更多相关文章
- 洛谷P2709 小B的询问 莫队
小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小 ...
- 洛谷.2709.小B的询问(莫队)
题目链接 /* 数列的最大值保证<=50000(k),可以直接用莫队.否则要离散化 */ #include<cmath> #include<cstdio> #includ ...
- 洛谷——P2709 小B的询问
P2709 小B的询问 莫队算法,弄两个指针乱搞即可 这应该是基础莫队了吧 $x^2$可以拆成$((x-1)+1)^2$,也就是$(x-1)^2+1^2+2\times (x-1)$,那么如果一个数字 ...
- 洛谷 P2709 小B的询问(莫队)
题目链接:https://www.luogu.com.cn/problem/P2709 这道题是模板莫队,然后$i$在$[l,r]$区间内的个数就是$vis[ ]$数组 $add()$和$del()$ ...
- [洛谷 P2709] 小B的询问
P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...
- 【刷题】洛谷 P2709 小B的询问
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
- [题解]洛谷P2709 小B的询问
地址 是一道莫队模板题. 分析 设\(\text{vis[i]}\)表示元素\(\text{i}\)出现的次数 当一个元素进入莫队时,它对答案的贡献增加.有\(\delta Ans=(X+1)^2-X ...
- 洛谷P2709 小B的询问
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
- P2709 小B的询问-莫队
思路 :依旧是 分块 块内按照 r 排序 不同块按照 L排序,处理好增加 删除对结果的影响即可. #include<bits/stdc++.h> using namespace std; ...
随机推荐
- 如何在代码层面提供CPU分支预测效率
关于分支预测的基本概念和详细算法可以参考我之前写的知乎回答,基本概念不再阐述了~~ https://www.zhihu.com/question/486239354/answer/2410692045 ...
- 【HCIE】ipv6之6to4隧道如何计算48位前缀地址
6to4隧道支持router-router,host-router,router-host,host-host 采用专用6to4地址,前缀为2002::/16 其中如何结合ipv4地址? 2002:i ...
- 从0开始基于Webpack5 搭建HTML+Less 前端工程
基于Webpack5 搭建HTMl+Less的前端项目 新建一个文件夹(比如命名为webpack) 用编辑器打开该文件夹,并在编辑器的终端执行 npm init -y 自动创建pa ...
- 解决学校在线评测系统不支持C++11的问题
如图,我们老师搞的这个评测系统它不支持C++11.但分析错误信息可知GCC本身版本是支持C++11的,只不过没开开.平时的时候我们可以对"g++"后使用"-std=c++ ...
- 虚拟机(Vmvare)与配置,得到一台学习机
准备: 1.Vmvare 2.CentOS7.4镜像 安装与配置操作系统: 1.配置虚拟机上网 2.配置静态ip地址 开始安装 1. 2.直接下一步选择我们准备好的镜像,然后下一步 3.修改虚拟机的名 ...
- Java学习笔记-学生管理系统
Java学习笔记 一个Student类 public class Student { private String sid; private String name; private String a ...
- 用crash tool观察ARM64 Linux地址转换
初学者学习Linux系统地址转换时,如果只是学习理论,又或者研读代码,那可能感觉比较枯燥.此时如果可以利用某些工具实际观察一下地址转换的过程,那可能会给枯燥的内核学习带来些微的乐趣.crash too ...
- 第6组 Alpha冲刺 (5/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.董翔云 4.杜筱 5.詹鑫冰 6.黄少丹 7.曹兰英 8.鲍凌函 9.曾丽莉 10.吴沅静 1.3 冲刺成果展示 1.1 基 ...
- JOISC2020 题解
Day1T1 建筑装饰4 题目链接:Day1T1 建筑装饰4 Solution 我们先考虑朴素的\(dp\)方法: 设\(dp_{i,j,k}\)表示前\(i\)个数中,选了\(j\)个\(B\)数组 ...
- R数据分析:如何简洁高效地展示统计结果
之前给大家写过一篇数据清洗的文章,解决的问题是你拿到原始数据后如何快速地对数据进行处理,处理到你基本上可以拿来分析的地步,其中介绍了如何选变量如何筛选个案,变量重新编码,如何去重,如何替换缺失值,如何 ...