首页 > 其他分享 >Luogu P2709 小B的询问

Luogu P2709 小B的询问

时间:2023-06-05 17:36:35浏览次数:53  
标签:ch int Luogu 询问 pos P2709 include 5211314

https://www.luogu.com.cn/problem/P2709#submit

小B的询问

题目描述

小B 有一个长为 \(n\) 的整数序列 \(a\),值域为 \([1,k]\)。
他一共有 \(m\) 个询问,每个询问给定一个区间 \([l,r]\),求:

\[\sum\limits_{i=1}^k c_i^2 \]

其中 \(c_i\) 表示数字 \(i\) 在 \([l,r]\) 中的出现次数。
小B请你帮助他回答询问。

输入格式

第一行三个整数 \(n,m,k\)。

第二行 \(n\) 个整数,表示 小B 的序列。

接下来的 \(m\) 行,每行两个整数 \(l,r\)。

输出格式

输出 \(m\) 行,每行一个整数,对应一个询问的答案。

样例 #1

样例输入 #1

6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6

样例输出 #1

6
9
5
2

提示

【数据范围】
对于 \(100\%\) 的数据,\(1\le n,m,k \le 5\times 10^4\)。

//标准莫队板子
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

int n, m, k, block;
int l = 1, r = 0, out[5211314], ans;
int a[5211314], pos[5211314], cnt[5211314]; 

struct ASK {
	int l, r, id;
}ask[5211314]; 

inline bool cmp(ASK a, ASK b) {
	if (pos[a.l] != pos[b.l]) return pos[a.l] < pos[b.l];
	else return a.r < b.r;
}

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch - '0');
		ch = getchar();
	}
	return x * f;
}

inline void Add(int x) {
	ans = ans + 2 * cnt[x] * 1 + 1;
	cnt[x] ++;
	return;
}

inline void Del(int x) {
	ans = ans - 2 * cnt[x] * 1 + 1;
	cnt[x] --;
	return;
}

int main() {
	n = read();
	m = read();
	k = read();
	block = sqrt(n);
	for (int i = 1; i <= n; ++ i) {
		a[i] = read();
		pos[i] = (i - 1) / block + 1;
	}
	for (int i = 1; i <= m; ++ i) {
		ask[i].l = read();
		ask[i].r = read();
		ask[i].id = i;
	}
	sort(ask + 1, ask + 1 + m, cmp);
	for (int i = 1; i <= m; ++ i) {
		while (ask[i].l < l) Add(a[-- l]);
		while (l < ask[i].l) Del(a[l ++]);
		while (r < ask[i].r) Add(a[++ r]);
		while (ask[i].r < r) Del(a[r --]);
		out[ask[i].id] = ans;
	}
	for (int i = 1; i <= m; ++ i) {
		printf("%d\n", out[i]);
	}
	return 0;
} 

标签:ch,int,Luogu,询问,pos,P2709,include,5211314
From: https://www.cnblogs.com/jueqingfeng/p/17458485.html

相关文章

  • [刷题笔记] Luogu P2895 Meteor Shower S
    ProblemSolution显然bfs,只不过有了限定条件,有实时的流星雨这里提供两种做法:Solution1这也是我一开始的做法模拟实时流星,由于bfs是按层搜的,是严格按照时间递增搜的,故可以模拟实时放流星。需要注意放流星的时间,如果第\(t\)秒有流星,则该秒不可以走,需要在每一秒前放流星。那......
  • [刷题笔记] LuoguP2658 汽车拉力比赛
    ProblemSolution需要找到最小满足题意的\(d\),显然\(d\)满足单调性,考虑二分二分\(d\),然后直接bfs,每次bfs判断能不能走的时候还需要加上高度差不超过二分的\(d\)(即满足),bfs跑完后看看所有的路标都被访问了没。(可以记录个数,因为不可能重复走)二分的时候注意\(l\)从0开始,不然会WA......
  • luogu P8497 [NOI2022] 移除石子
    题面传送门不好评价?首先我们考虑最基础的情况,当\(k=0,l_i=r_i\)时,相当于我们需要判定一个状态能不能被消完。这相当于我们要执行若干次\(2\)操作,使得每个位置要么大于等于\(2\),要么为\(0\)。为此我们需要挖掘一些操作\(2\)的性质。性质\(1\):操作区间长度不会超过\(5......
  • Luogu P1007 独木桥
    题目描述link思路找到独木桥的中间位置,最少时间考虑在端点左侧的,向左走,在端点右侧的向右走.最多时间考虑在端点左侧的向右走,在端点右侧的向左走.最少时间即为最优情况下最多的时间,最多时间即为最差情况下的最多时间Code#include<cstdio>#include<algorithm>......
  • Luogu P1008 三连击
    题目描述link思路因为\(1-9\)且不能重复使用,所以从\(123\)循环至\(789\),相应的\(2\)倍,\(3\)倍,即为另两个数字.对每个数字进行拆分,所用数字使用次数\(+1\),判断是否每个数字都被使用且只使用一次,输出即可.Code#include<cstdio>#include<cstring>i......
  • 最小生成树_LuoguP1669
    P1669P1669[USACO04DEC]BadCowtractorsS题目传送门题意简化:在一个有\(N\)个点\(M\)条边的图中选出\(N-1\)条边构成一棵树,使得树的总边权最大,求最大总边权。上述问题即为最小(大)生成树问题,本题为最大生成树,如有未详者可以移步P3366。该问题一般是Kruskal和Prim......
  • Luogu P1903 [国家集训队] 数颜色 / 维护队列
    题目来源https://www.luogu.com.cn/problem/P1903[国家集训队]数颜色/维护队列题目描述墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:\(Q\L\R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种......
  • 刷题笔记:Luogu P3956 棋盘
    ProblemSolutionDFS/BFS需要注意去重的时候可以重复走(因为有限定条件),只要新的步数比原来的步数小就可以走,其余情况模拟即可细节有点多,比如需要记录一下上一步的棋盘颜色(下一次搜索传递参数),因为牵扯到使用魔法问题,不能直接染,因为改变地图后后边很多操作都会受影响在列举可能性......
  • Luogu P2801 教主的魔法(Loj 数列分块入门 2)
    教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是\(N\)个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为\(1,2,\ldots,N\)。每个人的身高一开始都是不超过\(1000\)的正整数。教主的魔法每次可以把闭......
  • Luogu P5643 [PKUWC2018]随机游走
    题意给出一棵\(n\)结点树,从结点\(x\)出发,每次从当前点的所有边中选一条走过去,\(Q\)次询问给定一个点集\(S\),随机游走直到经过\(S\)中的每一个点至少一次的期望总步数,出发点\(x\)默认在开始时已经被经过。\(n\le18,Q\le5000\)解法萌新第一次见到这种题,感觉很神。......