【洛谷2709】小B的询问(莫队模板题)
大致题意: 有一个长度为\(N\)的序列,每个数字在\(1\sim K\)之间,有\(M\)个询问,每个询问给你一个区间,让你求出\(\sum_{i=1}^K c(i)^2\),其中\(c(i)\)表示数字\(i\)在该区间内的出现次数。
莫队算法
显然,这题可以用莫队算法来做,而这题本身就是莫队算法的一道模板题。
代码
#include<bits/stdc++.h>
#define N 50000
#define M 50000
using namespace std;
int n,Q,k,a[N+5],pos[N+5],cnt[N+5],ans[M+5];
struct Query
{
    int l,r,pos;
}q[M+5];
inline char tc()
{
    static char ff[100000],*A=ff,*B=ff;
    return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
    x=0;char ch;
    while(!isdigit(ch=tc()));
    while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
bool cmp(Query x,Query y)
{
    return pos[x.l]<pos[y.l]||(pos[x.l]==pos[y.l]&&(pos[x.l]&1?x.r<y.r:x.r>y.r));
}
int main()
{
    register int i;
    read(n),read(Q),read(k);
    for(i=1;i<=n;++i) read(a[i]),pos[i]=(i-1)/sqrt(n)+1;//边读入,边将序列分块
    for(i=1;i<=Q;++i) read(q[i].l),read(q[i].r),q[i].pos=i;//存储下来每一个询问
    sort(q+1,q+Q+1,cmp);//将询问以l所在的块为第一关键字,r的值为第二关键字sort一遍
    int L=q[1].l,R=q[1].r;//将L指针和R指针预处理为指向第一个询问的l和r
    for(i=q[1].l;i<=q[1].r;++i)//暴力求解第一个询问
    	ans[q[1].pos]-=cnt[a[i]]*cnt[a[i]],++cnt[a[i]],ans[q[1].pos]+=cnt[a[i]]*cnt[a[i]];
    for(i=2;i<=Q;++i)//对每一个询问依次求解
    {
    	ans[q[i].pos]=ans[q[i-1].pos];
        while(L<q[i].l) ans[q[i].pos]-=cnt[a[L]]*cnt[a[L]],--cnt[a[L]],ans[q[i].pos]+=cnt[a[L]]*cnt[a[L]],++L;//若L小于当前询问的l,则更新ans,并将L加1
        while(L>q[i].l) --L,ans[q[i].pos]-=cnt[a[L]]*cnt[a[L]],++cnt[a[L]],ans[q[i].pos]+=cnt[a[L]]*cnt[a[L]];//若L大于当前询问的l,则将L减1,并更新ans(注意,这里改变L值和更新ans的顺序与上一个操作不同)
        while(R>q[i].r) ans[q[i].pos]-=cnt[a[R]]*cnt[a[R]],--cnt[a[R]],ans[q[i].pos]+=cnt[a[R]]*cnt[a[R]],--R;//类似于上面的操作
        while(R<q[i].r) ++R,ans[q[i].pos]-=cnt[a[R]]*cnt[a[R]],++cnt[a[R]],ans[q[i].pos]+=cnt[a[R]]*cnt[a[R]];//类似于上面的操作
    }
    for(i=1;i<=Q;++i) write(ans[i]),putchar('\n');//对每一个答案按照读入顺序输出
    return 0;
}
												
											【洛谷2709】小B的询问(莫队模板题)的更多相关文章
- 洛谷.2709.小B的询问(莫队)
		
题目链接 /* 数列的最大值保证<=50000(k),可以直接用莫队.否则要离散化 */ #include<cmath> #include<cstdio> #includ ...
 - 洛谷P2709 小B的询问 莫队
		
小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小 ...
 - 洛谷P2709 小B的询问 莫队做法
		
题干 这个是用来学莫队的例题,洛谷详解 需要注意的一点,一定要分块!不然会慢很多(直接TLE) 其中分块只在排序的时候要用,并且是给问题右端点分块 再就是注意add与del函数里的操作,增加数量不提, ...
 - 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)
		
莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...
 - 洛谷2709 小B的询问(莫队)
		
题面 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R] ...
 - luogu 2709 小B的询问 莫队
		
题目链接 Description 小B有一个序列,包含\(N\)个\(1-K\)之间的整数.他一共有\(M\)个询问,每个询问给定一个区间\([L..R]\),求\(\sum_{i=1}^{K}c_i ...
 - luogu 2709小b的询问--莫队
		
https://www.luogu.org/problemnew/show/P2709 无修改的莫队几乎没有什么太高深的套路,比较模板吧,大多都是在那两个函数上动手脚. 这题询问每一种数字数量的平方和 ...
 - 洛谷——P2709 小B的询问
		
P2709 小B的询问 莫队算法,弄两个指针乱搞即可 这应该是基础莫队了吧 $x^2$可以拆成$((x-1)+1)^2$,也就是$(x-1)^2+1^2+2\times (x-1)$,那么如果一个数字 ...
 - [题解]洛谷P2709 小B的询问
		
地址 是一道莫队模板题. 分析 设\(\text{vis[i]}\)表示元素\(\text{i}\)出现的次数 当一个元素进入莫队时,它对答案的贡献增加.有\(\delta Ans=(X+1)^2-X ...
 - 【luogu1709】小B的询问 - 莫队
		
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
 
随机推荐
- IOS下去掉input submit圆角和
			
在iOS系统下input submit会有圆角,如果添加有背景色,背景色出错,在安卓系统是没有这些问题,可以在input样式加上这段样式 input{ -webkit-appearance: none ...
 - PHP foreach ($arr as &$value)
			
foreach ($arr as &$value) 看到一个有意思的东西: <?php $arr = ['1', '2', '3', '4']; foreach ($arr as &am ...
 - vue 的计算属性computed自我理解
			
类型:{ [key: string]: Function | { get: Function, set: Function } } 计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.注意, ...
 - Springboot与MyBatis简单整合
			
之前搭传统的ssm框架,配置文件很多,看了几天文档才把那些xml的逻辑关系搞得七七八八,搭起来也是很麻烦,那时我完全按网上那个demo的版本要求(jdk和tomcat),所以最后是各种问题没成功跑起来 ...
 - HUID 5558 Alice's Classified Message   后缀数组+单调栈+二分
			
http://acm.hdu.edu.cn/showproblem.php?pid=5558 对于每个后缀suffix(i),想要在前面i - 1个suffix中找到一个pos,使得LCP最大.这样做 ...
 - es6 vs commonjs
			
'use strict' export function showMe() { alert("es6"); }; class logging { constructor() { a ...
 - nodejs 实践:express 最佳实践(四) express-session 解析
			
nodejs 实践:express 最佳实践(四) express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs ...
 - css3 转换 过渡 及动画
			
转换transform: 通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸.您可以使用 2D 或 3D 转换来转换您的元素 2D转换属性: transform 向元素应用 2D 或 ...
 - QTablewidget 简单例子
			
[1]QTableWidget简介 QTableWidget是QT对话框设计中常用的显示数据表格的控件. 学习QTableWidget就要首先看看QTableView控件(控件也是有”家世“的!就像研 ...
 - VS中bin,app_code,app_data,app_browser,app_GlobalResources等文件夹的作用 .
			
1. Bin文件夹 Bin文件夹包含应用程序所需的,用于控件.组件或者需要引用的任何其他代码的可部署程序集.该目录中存在的任何.dll文件将自动地链接到应用程序.如果在该文件夹中留有不用的或过期的文 ...