首页 > 其他分享 >洛谷4113(树状数组+离线处理)

洛谷4113(树状数组+离线处理)

时间:2023-04-04 21:44:06浏览次数:54  
标签:arr 洛谷 采花 离线 leq 4113 颜色 include 公主

[HEOI2012]采花

题目描述

萧薰儿是古国的公主,平时的一大爱好是采花。

今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。

花园足够大,容纳了 $n$ 朵花,共有 $c$ 种颜色,用整数 $1 \sim c$ 表示。且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴。同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。

由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵洁综合各种因素拟定了 $m$ 个行程,然后一一向你询问公主能采到的花共有几种不同的颜色。

输入格式

输入的第一行是三个用空格隔开的整数,分别代表花的个数 $n$,花的颜色数 $c$,以及行程数 $m$。

输入的第二行是 $n$ 个用空格隔开的整数,第 $i$ 个整数代表第 $i$ 朵花的颜色 $x_i$。

第 $3$ 行到第 $(m + 2)$ 行,每行两个整数 $l, r$,第 $(i + 2)$ 行的数字代表第 $i$ 次行程为第 $l$ 到第 $r$ 朵花。

输出格式

共输出 $m$ 行,每行一个整数。第 $i$ 行的整数代表第 $i$ 次行程公主能采到的花共有几种不同的颜色。

样例 #1

样例输入 #1

5 3 5
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5

样例输出 #1

2
0
0
1
0

提示

输入输出样例 $1$ 解释

共有五朵花,颜色分别为 $1,2,2,3,1$。

对于第一次行程,公主采花的区间为 $[1, 5]$,可以采位置 $1,2,3,~5$ 处的花,共有 $1$ 和 $2$ 两种不同的颜色。

对于第二次行程,公主采花的区间为 $[1, 2]$,但是颜色为 $1$ 和 $2$ 的花都只出现了一次,因此公主无花可采。

对于第三次行程,公主采花的区间为 $[2, 2]$,但是颜色为 $2$ 的花只出现了一次,公主无花可采。

对于第四次行程,公主采花的区间为 $[2, 3]$,可以采 $2,~3$ 位置的花,只有 $2$ 这一种颜色。

对于第五次行程,公主采花的区间为 $[3,5]$,但是颜色为 $1, 2, 3$ 的花都只出现了一次,因此公主无花可采。

数据范围与约定

本题采用多测试点捆绑测试,共有两个子任务

对于子任务 $1$,分值为 $100$ 分,保证 $1 \leq n, c, m \leq 3 \times 10^5$。

对于子任务 $2$,分值为 $100$ 分,保证 $1 \leq n, c, m \leq 2 \times 10^6$。

对于全部的测试点,保证 $1 \leq x_i \leq c$,$1 \leq l \leq r \leq n$。

思路:离线化处理,在将询问按照左端点从大到小排序,处理每个询问。

思路类似于:hdu-4630(树状数组) - 魏老6 - 博客园 (cnblogs.com)

但多了一步删除操作。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<algorithm>
#include<fstream>
#include<iostream>
#include<cstdio>
#include<deque>
#include<string>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<unordered_map>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 310000
#define N 5000000
#define M (int)1e8-3
#define endl '\n'
#define exp 1e-8
#define lc p << 1
#define rc p << 1|1
#define lowbit(x) ((x)&-(x))
const double pi = acos(-1.0);
typedef long long LL;
typedef unsigned long long ULL;
inline ULL read() {
	ULL 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 ^ 48);
		ch = getchar();
	}
	return x * f;
}
void print(ULL x) {
	if (x > 9)print(x / 10);
	putchar(x % 10 ^ 48);
}
int n, m, arr[N], tree[N],ans[N],k,last[N],old[N];
struct node
{
	int l, r, i;
	bool operator < (const node& a)const
	{
		return l > a.l;
	}
}qu[N];
void update(int x, int d)
{
	while (x <= N)
	{
		tree[x] += d;
		x += lowbit(x);
	}
}
int sum(int x)
{
	int res = 0;
	while (x)
	{
		res += tree[x];
		x -= lowbit(x);
	}
	return res;
}
int main()
{
	n = read(), k = read(), m = read();
	for (int i = 1; i <= n; i++)
	{
		arr[i] = read();
	}
	for (int i = 1; i <= m; i++)
	{
		qu[i].l = read(), qu[i].r = read(), qu[i].i = i;
	}
	sort(qu + 1, qu + 1 + m);
	int j = 1;
	for (int i = n; i >= 1; i--)
	{
		if (last[arr[i]])
		{
			update(last[arr[i]], 1);
			if (old[arr[i]])
			{
				update(old[arr[i]], -1);
			}
			old[arr[i]] = last[arr[i]];
		}
		last[arr[i]] = i;
		while (qu[j].l >= i)
		{
			ans[qu[j].i] = sum(qu[j].r) - sum(qu[j].l - 1);
			j++;
			if (j > m)break;
		}
	}
	for (int i = 1; i <= m; i++)
	{
		printf("%d\n", ans[i]);
	}
	return 0;
}

标签:arr,洛谷,采花,离线,leq,4113,颜色,include,公主
From: https://www.cnblogs.com/wyh344866/p/17288014.html

相关文章

  • 洛谷 P3377 【模板】左偏树(可并堆)题解 左偏树模板题
    题目链接:https://www.luogu.com.cn/problem/P3377维护左偏树的同时还需要维护一个并查集。但是并查集也就一个find操作。pop的时候更新f[x]的操作很神奇。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;intn,m,op,x,y,val[m......
  • 【服务器数据恢复】raid5多块硬盘离线导致存储的卷无法挂载,EXT3文件系统元数据被破坏
    服务器数据恢复环境&故障:某企业一台存储设备,一组由16块硬盘组建的raid5磁盘阵列。管理员在巡检过程中发现该存储的卷无法挂载,经过检查发现存储设备的raid5磁盘阵列中有2块硬盘离线。服务器数据恢复过程:1、检查该存储当前状态,通过storagemanager将存储的日志状态备份。2、将存......
  • 对未来的自己的一个提醒。关于打表答题的思路,洛谷P5731
    P5731【深基5.习6】蛇形方阵-洛谷|计算机科学教育新生态(luogu.com.cn)这道题就是纯纯找规律的模拟题,但是在比赛或者思维比较松散的情况下紧张的时候会想不出模拟思路这时候如果测试数据的范围比较小,如本题的数据最大就到九阶方阵,所以可以手算出每一种类型打表输出,不用去......
  • bzoj1969. [AHOI2005] LANE 航线规划 树链剖分+离线逆向处理删边
    保证了无论怎么破坏航线,图都会是一个连通图也就是说,起码肯定有一棵生成树考虑在生成树上U,V之间加边,会对树上各个点的割边情况产生什么影响对于任意点对(u,v),如果它们之间的最短路径不经过从U到V的树上路径,那是没有影响的否则:关键路径的数目会减少减少了多少?U,V之间树上路径经......
  • 洛谷 P2398. GCD SUM
    题目描述求$$\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(i,j)$$输入:2输出:5算法1 线性筛 $O(n)$将式子变形:要知道一个前置定理$\sum\limits_{d|n}\varphi(d)=n$艾弗森约定:定义$\\\[P]$=$$\begin{cases}P\text{}is\text{}tr......
  • .net6 制作elementplus离线文档
    1、新建net6项目设置配置信息<ProjectSdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net6.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings>......
  • 洛谷 P8918 『MdOI R5』Jump 题解
    题目传送门这一题其实很简单,只是要想到正确方法我一开始用了奇怪的搜索①无解的情况:看上去很离奇,实际上略加思索就会发现,如果输入\(n\)为偶数,那么就铁定无解。证明过程如下:令\(n\bmod{2}=0\),人距离\(n\)点的距离为\(dis\),则当走出第一步(步长为\(1\))时,有:\[dis=\midn......
  • 洛谷 P8742 [蓝桥杯 2021 省 AB] 砝码称重
    经典01背包题首先介绍一下01背包,即一种DP问题,以放置物品为模型,每个物品只能放一次。其区分于完全背包(每个物品可以放无限多次),以及多重背包(每个物品有一个固定次数上限)。题中给出了$N$个砝码及每个砝码的质量,要求我们求出可以称出质量的种数。由此想到转化为01背包。......
  • 洛谷 P9009 [入门赛 #9] 牵连的世界 (Hard Version) 题解
    P9009[入门赛#9],真9。这是一道hack题,即你需要自造符合题意的数据使题中所给程序无法AC。Task01看数据范围知一切,显然有\(-2\times10^9\lea_i\le2\times10^9\),因此\(a_i\)可能为负数。注意C/C++中的取模%(mod)运算实质上是为取余运算(rem)对于整型数a,b来说......
  • 洛谷 P8762 [蓝桥杯 2021 国 ABC] 123 题解
    为什么可以使用前缀和,这里提供解释:初读题目,我们发现这个数列很迷惑,似乎不能使用数学方法来解。\[1,1,2,1,2,3,1,2,3,4,\cdots\]但是,我们可以想到数形结合的方式,我们将数列看作一个三角形,于是他变成了:\[1\]\[1,2\]\[1,2,3\]\[1,2,3,4\]\[\cdots\cdots\]于是本题变得好思......