洛谷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; ...
随机推荐
- 前后端分离后台管理系统 Gfast v3.0 全新发布
GFast V3.0 平台简介 基于全新Go Frame 2.0+Vue3+Element Plus开发的全栈前后端分离的管理系统 前端采用vue-next-admin .Vue.Element UI ...
- Java 18 新特性:使用Java代码启动jwebserver
前几天分享了Java 18 新特性:简单Web服务器的jwebserver命令行功能. 今天换一种方式,使用Java代码来实现一个静态资源服务器. 详细步骤我录了个视频放到B站了,感兴趣的小伙伴可以点 ...
- C++进阶-3-5-set/multiset容器
C++进阶-3-5-set/multiset容器 1 #include<iostream> 2 #include<set> 3 using namespace std; 4 5 ...
- 层层剖析一次 HTTP POST 请求事故
vivo 互联网服务器团队- Wei Ling 本文主要讲述的是如何根据公司网络架构和业务特点,锁定正常请求被误判为跨域的原因并解决. 一.问题描述 某一个业务后台在表单提交的时候,报跨域错误,具体如 ...
- 【多线程】观测线程状态 getState()
观测线程状态 getState() Thread.State(查看JDK帮助文档) 线程状态.线程可以处于以下状态之一: [NEW] 尚未启动的线程处于此状态. [RUNNABLE] 在Java虚拟机 ...
- unity---2d游戏杂记
2d游戏制作的笔记 save Layout 增加配置 Packges文件夹 插件 调整视野 鼠标中键 拉近拉远 鼠标右键 平移 Alt+鼠标左键 移动视角 Pivot/Center 当前物体中心和多个 ...
- CIAGAN: Conditional Identity Anonymization Generative Adversarial Networks阅读笔记
CIAGAN: Conditional Identity Anonymization Generative Adversarial Networks 2020 CVPR 2005.09544.pdf ...
- redis高可用、redis集群、redis缓存优化
今日内容概要 redis高可用 redis集群 redis缓存优化 内容详细 1.redis高可用 # 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个sl ...
- Unity-自定义事件派发器的两次尝试
一.前言: 在游戏开发的很多时候,需要引用其他类的方法,但是一旦类多起来了,相互引用会导致引用关系混乱,极其难以阅读. 以前初次做抖音小游戏时,和一位经验老道的cocos程序员合作,看到我写的代码他不 ...
- HMS Core分析服务6.5.0版本更新啦
卸载用户价值的合理评估对制定相应的用户召回策略具有重要意义. HMS Core分析服务新版本支持查看用户卸载前使用次数.崩溃次数等指标.通过这些数据,您可以更直观地判断已卸载人群粘性以及崩溃问题对用户 ...