首页 > 其他分享 >「解题报告」P1972 HH的项链

「解题报告」P1972 HH的项链

时间:2023-08-20 15:22:41浏览次数:37  
标签:贝壳 树状 int HH 解题 plan 项链 P1972

题目链接:HH的项链

这道题做法很多,看到有用线段树,主席树和莫队做的,但我不太会用树状数组,所以讲解一下树状数组的解法。

题干告诉我们要求区间内的贝壳的种类数,那么用树状数组怎么维护呢?我们通过一个简单的例子来理解一下。对于一个序列:1 4 3 2 4 2,我们要去求这个序列里的贝壳的个数,我们就要考虑去重,将这个序列变为1 4 3 2 0 0,这样就代表了\(1\sim6\)里的贝壳的种类数。

但是我们会发现一个问题,就是这样处理的话我们要想求\(3\sim6\),结果就会是2,但实际上的答案应该是3,那么我们就可以把某一区间内比较靠后的贝壳,作为这一区间内这种贝壳出现的唯一次数,然后记录一下上一个同种贝壳出现的位置,更新传递一下即可。具体做法就是将询问区间的操作离线,按右端点的大小进行排序,然后一一枚举贝壳的数量即可。

代码实现:

点击查看代码
#define lowbit(x) x & (-x)
using namespace std;
const int M = 1e6 + 10;
struct node {
	int l, r, id;
	friend bool operator<(node x1,node x2) {
		if (x1.r == x2.r) return x1.l < x2.l;
		return x1.r < x2.r;
	}
} plan[M];
int n, m, k=1;
int a[M], p[M], ans[M], c[M];
void add(int x, int val) {
	for (int i = x; i <= n; i += lowbit(i))
		c[i] += val;
}
int query(int x) {
	int res = 0;
	for (int i = x; i; i -= lowbit(i))
		res += c[i];
	return res;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	cin >> m;
	for (int i = 1; i <= m; i++)
	{
		cin >> plan[i].l >> plan[i].r;
		plan[i].id = i;
	}
	sort(plan + 1, plan + 1 + m);
	for (int i = 1; i <= plan[m].r; i++) {
		if (!p[a[i]]) {
			p[a[i]] = i;
			add(i, 1);
		} else {
			add(p[a[i]], -1);
			p[a[i]] = i;
			add(p[a[i]], 1);
		}
		while (i == plan[k].r) {
			ans[plan[k].id] = query(plan[k].r) - query(plan[k].l-1);
			k++;
		}
	}
	for (int i = 1; i <= m; i++)
		cout << ans[i] << '\n';
	return 0;
}

标签:贝壳,树状,int,HH,解题,plan,项链,P1972
From: https://www.cnblogs.com/Aewrxuk/p/17644033.html

相关文章

  • Atcoder Beginner Contest 315 解题报告
    AtcoderBeginnerContest315ContestlinkHintsD尝试优化暴力。A-tcdr没啥好说的,模拟。代码实现voidSolve(){ while(charch=getchar()) { if(!isalpha(ch))return; if(ch!='a'&&ch!='e'&&ch!='i'&&ch!='o......
  • 【数学】高中数学必考立体几何知识点汇总,附8大解题技巧!
    立体几何必考知识汇总一空间几何体结构1.空间结合体:如果我们只考虑物体占用空间部分的形状和大小,而不考虑其它因素,那么由这些物体抽象出来的空间图形,就叫做空间几何体。2.棱柱的结构特征:有两个面互相平行,其余各面都是四边形,每相邻两个四边形的公共边互相平行,由这些面围成的图形叫做......
  • d MMM yyyy HH:mm:ss 描述的意思
    January-JanFebruary-FebMarch-MarApril-AprMay-MayJune-JunJuly-JulAugust-AugSeptember-SepOctober-OctNovember-NovDecember-Dec格式:privatevalformatter=SimpleDateFormat("dMMMyyyyHH:mm:ss")在日期时间格式中,d表......
  • 「P4313」文理分科 解题报告
    「P4313」文理分科题目描述文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过)小P所在的班级要进行文理分科。他的班级可以用一个\(n\timesm\)的矩阵进行描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择一科。同学们在选择科目的时候会获......
  • 「USACO2007JAN」Balanced Lineup 解题报告
    「USACO2007JAN」BalancedLineup传送门挖个坑。。。#include<bits/stdc++.h>usingnamespacestd;intn,q,l,r,f1[50002][30],f2[50002][30],a[50002];voidprework(){for(inti=1;i<=n;i++){f2[i][0]=a[i];f1[i][0]=a[i];}intk=log(n......
  • HHKB2020 D 题解
    problem&blog。特判一下\(a+b>n\)时为\(0\)。正难则反,计算重叠的方案数。重叠即\(x,y\)轴均有交集,于是转化为两条线段相交的方案数(两条线段认为是不同的)。正难则反,计算不相交的方案数。第一条线段有\((n-b+1)-a+1=n-a-b+2\)种可能,第二条有\((n-a-b+1)\)种可能,故方案......
  • 「解题报告」AtCoder Beginner Contest 313
    比赛地址:AtCoderBeginnerContest313-AtCoder后记:请正确理解题意后再做题!!!A-ToBeSaikyoA-ToBeSaikyo(atcoder.jp)每个人有一个数值,问第一个人要加多少才能使得自己的数值变成最大的。就这么个破题我还WA了一发//Thecodewaswrittenbyyifan,andyifanis......
  • ABC313C 解题报告
    赛前看到这场C的分值直接飙上\(400\)就知道不是个善茬。这道题给了个启发,算是积累个trick吧。题目传送门简要题意:给定长为\(n\)的序列,进行若干次以下操作:每次选定两个整数\(i\)和\(j\),使得\(a_{i}\leftarrowa_{i}+1\)并使得\(a_{j}\leftarrowa_{j}-1\),要求最......
  • [解题报告] 2023.8.2 dp专题练习赛
    比赛链接:Link[团队私有]T1:https://www.cnblogs.com/SXqwq/p/17600671.htmlT2:https://www.cnblogs.com/SXqwq/p/17601007.htmlT3:完全背包板子T4:https://www.cnblogs.com/SXqwq/p/17601622.html......
  • HHDESK便捷功能介绍三
    1连接便捷显示工作中,往往需要设置很多资源连接。而过多的连接设,往往很容易混淆。在HHDESK中,当鼠标点击连接时,会在下方显示本连接的参数,方便用户查看。2日志查看实际工作中,查看日志是一件很麻烦的事情,需要确定工作文件夹,一个个打开,再找到日志文件;如今HHDESK帮您一键完成,节......