首页 > 其他分享 >[Vijos P1448] 校门外的树 题解

[Vijos P1448] 校门外的树 题解

时间:2024-02-16 17:22:21浏览次数:22  
标签:int 题解 P1448 long 端点 ans 区间 Vijos 种类

题目描述

校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作:

  • k == 1,读入l, r表示在 l 到 r 之间种上一种树,每次操作种的树的种类都不同;

  • k == 2,读入l, r表示询问 l 到 r 之间有多少种树。

注意:每个位置都可以重复种树。

输入格式

第一行 n 表示道路总长为 n,共有 m 个操作;
接下来 m 行为 m 个操作。

输出格式

对于每个 k == 2 输出一个答案。

样例

样例输入

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

样例输出

1
2

题解

拿到题第一眼,发现这不和HH的项链很像吗,但仔细观察就会发现,那道题是给出了确定的数列与确定的区间,而这道题的序列是变化的,这决定了区间询问不能由上一步继承下来,所以要换思路;

仔细思考,我们不难发现,如果要求一段区间的种类数,只需用1~右端点这段区间的总种类数-1~左端点这段区间的总种类数,即可得到解;

对于上述思路,很容易发现要求很多前缀和,于是用两个树状数组分别求左端点总数和右端点总数,最后用1~右端点这段区间的总左端点数 - 1~左端点这段区间的总右端点数(不包括左端点,因为种树是也会在左端点种)即为结果;

证明此做法的正确性:

1~右端点这段区间的总左端点数 相当于 1~右端点这段区间的总种类数;

1~左端点这段区间的总右端点数 相当于 1~左端点这段区间的总种类数;

根据上述结论,即可得知此做法正确;

如果还不明白,那就画画图理解理解,我有点懒,就不画了;

所以,这道题的本质就是树状数组的单点修改与区间查询;

代码

#include <iostream>
using namespace std;
int t[1000005]; //左端点;
int t1[1000005]; //右端点;
int n, m;
int lowbit(int x) {
	return x & (-x);
}
void add_dian(int x, int k) { //左端点加点;
	while(x <= n) {
		t[x] += k;
		x += lowbit(x);
	}
}
void add_dian1(int x, int k) { //右端点加点;
	while(x <= n) {
		t1[x] += k;
		x += lowbit(x);
	}
}
long long ask_sum(int x) { //左端点求和;
	long long ans = 0;
	while(x > 0) {
		ans += t[x];
		x -= lowbit(x);
	}
	return ans;
}
long long ask_sum1(int x) { //右端点求和;
	long long ans = 0;
	while(x > 0) {
		ans += t1[x];
		x -= lowbit(x);
	}
	return ans;
}
int main() {
	cin >> n >> m;
	int k, a, b;
	for (int i = 1; i <= m; i++) {
		cin >> k >> a >> b;
		if (k == 1) {
			add_dian(a, 1);
			add_dian1(b, 1);
		}
		if (k == 2) {
			cout << ask_sum(b) - ask_sum1(a - 1) << endl; //不包括区间左端点,所以要a - 1;
		}
	}
	return 0;
}

标签:int,题解,P1448,long,端点,ans,区间,Vijos,种类
From: https://www.cnblogs.com/PeppaEvenPig/p/18017306

相关文章

  • CF55D Beautiful numbers 题解
    题目链接:CF或者洛谷常见知识点组合经典题。首先,一眼数位dp类型题,考虑需要处理些怎样的判断合法数位信息。经典操作对于跟整除有关的判断,数位dp为了减少使用空间,都可以考虑记忆化模数减少空间开销。对于整除若干个数,即整除这若干个数的最小公倍数即可,是一个非常常用......
  • 【题解】P4722 【模板】最大流 加强版 / 预流推进
    更好阅读体验CHAPTER0废话1.常见的最大流算法可以大致分为两种:找增广路和预流推进2.从理论时间复杂度上界来看,找增广路算法的最坏时间复杂度为\(O(n^2m)\),而预流推进算法的最坏时间复杂度为\(O(n^2\sqrt{m})\),看起来预流推进要显然优于找增广路,但在实际应用(尤指OI)中,由于包......
  • HDU-Employment Planning题解
    题目在这里————————————————————————————————EmploymentPlanning简单的一道dp关键的点在于想到用枚举实现各种情况的讨论关键的注释写在代码里了还是很清晰的捏~#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x......
  • 题解 LGP10144【[WC/CTS2024] 水镜】
    题解P10144【[WC/CTS2024]水镜】题目描述给定一个长度为\(n\)的正整数序列\(h_1,h_2,\cdots,h_n\),求满足以下所有条件的二元组\((u,v)\)的数量:\(1\leu<v\len\),且\(u,v\)为整数;存在一个正实数\(L\)以及一个长度为\((v-u+1)\)的序列\(r_u,r_{u+......
  • Codeforces Round 926 (Div. 2) 题解
    比赛链接:https://codeforces.com/contest/1929官解链接:https://codeforces.com/blog/entry/125943出的很差的一场。推歌CF1929A.SashaandtheBeautifulArray题意任意排列数组\(a_{1..n}\),求\(\sum_{i=2}^n(a_i-a_{i-1})\)的最大值。题解见过最显然的A题,奠定了......
  • HH的项链 题解
    题目描述HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。......
  • 盖房子 题解
    题目描述永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING_),他想在这块土地上建造一所房子,这个房子必须是正方形的。但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦。他希望找到一块最大的正方形无瑕疵土......
  • 三角蛋糕 题解
    题目描述XP在机房里放了一块正三角形的大蛋糕,但是第二天他发现蛋糕被老鼠咬坏了。XP不想让蛋糕白白的被浪费,于是他把蛋糕分割成了一个个的小正三角形(如上图所示)。黑色的小正三角形表示老鼠把那一块咬坏了。XP想要切出一块最大的没被老鼠咬坏正三角形的蛋糕,可是最大的三角形有多......
  • CF896C Willem, Chtholly and Seniorious 题解
    题目链接:CF或者洛谷比较经典的题目看到存在随机数据以及区间赋值先别急,我们发现第四个操作是很难办的,第四个操作貌似只有暴力才好做。这个时候我们可以考虑使用珂朵莉树来做,这题也是珂朵莉树的出处。使用平衡树去写珂朵莉树的话,那么随机数据下,连续段的期望为\(\log{n}\)个,所......
  • 洛谷 P9912 [COCI 2023/2024 #2] Zatopljenje 题解
    首先发现区间中的个数等于\(\texttt{高度大于x的位置的个数}-\texttt{连续两个位置都是大于x的位置的个数}\)。具体令\(H_i=\min(h_i,h_{i+1})(i\in[1,n-1])\),那么对于一次询问答案\(ans=\sum\limits_{i=l}^{r}[h_i>x]-\sum\limits_{i=l}^{r-1}[H_i>x]\),其......