【bzoj3781】小B的询问 莫队算法
算法 莫队 询问
2023-09-11 14:22:40 时间
原文地址:http://www.cnblogs.com/GXZlegend/p/6803821.html
题目描述
小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。
输入
第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。
输出
M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
样例输入
6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6
样例输出
6
9
5
2
题解
莫队算法模板题,优雅的暴力
设原来有n个某颜色,加1后对答案的贡献为(n+1)^2-n^2=2*n+1,减1对答案的贡献为(n-1)^2-n^2=-(2*n-1)。
然后各种区间平移得到答案。
#include <cstdio> #include <cmath> #include <algorithm> #define N 50010 using namespace std; struct data { int l , r , b , p; }a[N]; int c[N]; long long ans[N] , cnt[N]; bool cmp(data x , data y) { return x.b == y.b ? x.r < y.r : x.b < y.b; } int main() { int n , m , k , i , si , lp = 1 , rp = 0 , now = 0; scanf("%d%d%d" , &n , &m , &k); si = (int)sqrt(n); for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &c[i]); for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &a[i].l , &a[i].r) , a[i].b = (a[i].l - 1) / si , a[i].p = i; sort(a + 1 , a + m + 1 , cmp); for(i = 1 ; i <= m ; i ++ ) { while(lp < a[i].l) now -= 2 * cnt[c[lp]] - 1 , cnt[c[lp]] -- , lp ++ ; while(rp > a[i].r) now -= 2 * cnt[c[rp]] - 1 , cnt[c[rp]] -- , rp -- ; while(lp > a[i].l) lp -- , now += 2 * cnt[c[lp]] + 1 , cnt[c[lp]] ++ ; while(rp < a[i].r) rp ++ , now += 2 * cnt[c[rp]] + 1 , cnt[c[rp]] ++ ; ans[a[i].p] = now; } for(i = 1 ; i <= m ; i ++ ) printf("%lld\n" , ans[i]); return 0; }
相关文章
- 用简单直白的方式讲解A星寻路算法原理
- 【BZOJ3585/3339】mex 莫队算法+分块
- 【BZOJ3781、2038】莫队算法2水题
- 【三维人脸模型贴图算法】基于离散拉普拉斯-贝尔特拉米算子的三维人脸模型贴图算法的MATLAB仿真
- 连续连通域检测算法的MATLAB仿真
- 基于QUASI-ML decoder算法的PSK信号准最大似然译码器matlab性能仿真
- MAX-SUM算法信息传递规则的优化
- C#,初学琼林(05)——二分法查找(binary search,二分法搜索)数组内指定值的算法与源代码
- 测试员的算法面试题-找众数
- 最小生成树-prim算法模板
- 海量数据处理算法—Bit-Map
- 《数据挖掘:理论与算法》学习笔记(一)走进数据科学
- Unity 实现A* 寻路算法
- 分布式选举算法
- 基于LSD的直线提取算法
- (转)Skyline timeseries异常判定算法
- [算法课]全面翻新计划!第七周全解
- 【 Gym - 101138D 】Strange Queries (莫队算法)
- 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题
- 【bzoj4542】[Hnoi2016]大数 莫队算法
- 【bzoj4940】[Ynoi2016]这是我自己的发明 DFS序+树上倍增+莫队算法
- 【bzoj5016】[Snoi2017]一个简单的询问 莫队算法