首页 > 其他分享 >[CF2048F] Kevin and Math Class 题解

[CF2048F] Kevin and Math Class 题解

时间:2025-01-17 20:33:30浏览次数:1  
标签:CF2048F int 题解 filename 62 Math DP define

注意到这里有个区间的 \(b_i\) 最小。我们考虑每个 \(b_i\) 作为最小的时候各操作几次。显然每个 \(b_i\) 的【操作区间】更长是不劣的。于是这些个 \(b_i\) 是可以打成笛卡尔树,进行 DP。

想到这一点,DP 便是不难的了。
定义 \(f_{i, j}\) 为以 \(i\) 为根的子树内,最优操作后最大值为 \(j\) 的最少操作次数。但是状态数很多,而答案的值域很少(每次都至少折半,顶多 \(60\) 多次)。有个很典的套路是将状态的一维与答案对调。
于是定义新的 \(f_{i, j}\) 为以 \(i\) 为根的子树内,操作 \(j\) 次后得到的最优的最大值。答案统计就是最小的 \(j\),满足 \(f_{root, j} = 1\)。

DP 过程就是一个背包合并。DP 的过程总先合并儿子,再将本身统计进去,可以巧妙地解决 \(b_i\) 要算进整个区间的小事情。
注意 \(\min,\max\) 的细节。
时间复杂度 \(O(n \log ^2 V)\)。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define all(v) v.begin(), v.end()
#define int long long
using namespace std;

//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)
#define multi_cases 1

namespace Traveller {
	const int N = 2e5+2;
	
	int n, a[N], b[N];
	int root, l[N], r[N];
	stack<int> st;
	
	int f[N][62];
	void solve(int u) {
		if(u == 0) return;
		if(l[u] == 0 && r[u] == 0) {
			f[u][0] = a[u];
			for(int i = 1; i < 62; ++i) f[u][i] = f[u][i-1] / b[u];
			return;
		}
		
		solve(l[u]), solve(r[u]);
		for(int i = 0; i < 62; ++i)
			for(int j = 0; j <= i; ++j)
				f[u][i] = min(f[u][i], max(a[u], max(f[l[u]][j], f[r[u]][i-j])));
		for(int i = 1; i < 62; ++i)
			f[u][i] = min(f[u][i], f[u][i-1] / b[u]);
	}
	
	void main() {
		scanf("%lld", &n);
		for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]), --a[i];
		for(int i = 1; i <= n; ++i) scanf("%lld", &b[i]);
		
		for(int i = 1; i <= n; ++i) l[i] = r[i] = 0;
		
		while(!st.empty()) st.pop();
		b[root = 0] = Linf;
		for(int i = 1; i <= n; ++i) {
			while(!st.empty() && b[i] < b[st.top()]) l[i] = st.top(), st.pop();
			if(!st.empty()) r[st.top()] = i; 
			st.push(i);
			if(b[i] < b[root]) root = i;
		}
		
		for(int i = 1; i <= n; ++i)
			for(int j = 0; j < 62; ++j) f[i][j] = Linf;
		solve(root);
		for(int i = 0; i < 62; ++i)
			if(f[root][i] == 0) {
				printf("%lld\n", i);
				return;
			}
	}
}

signed main() {
#ifdef filename
	FileOperations();
#endif
	
	signed _ = 1;
#ifdef multi_cases
	scanf("%d", &_);
#endif
	while(_--) Traveller::main();
	return 0;
}

闲话:一开始写了很__的做法,结果 T 飞。后来抄题解抄了这种做法。时间复杂度相同,由于(笛卡尔树的某种性质?数据太弱?)神秘原因,快了许多。950 多 ms 直接飘过。正解应该是要用一下单调性,合并的时候上点手法消掉一只 \(\log\)。

标签:CF2048F,int,题解,filename,62,Math,DP,define
From: https://www.cnblogs.com/wfc284/p/18677624

相关文章

  • 嵌入式杂谈——(问题解决三:嵌入式中的数据类型)
    列举1. 标准固定宽度整数类型这些类型定义在 <stdint.h> 头文件中,用于明确指定数据的位数,适合嵌入式系统中需要精确控制数据大小的场景。类型位数范围(有符号)范围(无符号)说明int8_t8-128到127-8位有符号整数uint8_t8-0到2558位无符号整数int16_t16-32,768到32,767-......
  • AcWing 98. 分形之城 题解
    题面link【题目描述】城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。而这座名为Fractal的城市设想了这样的一个规划方案,如下图所示:当城区规模扩大之后,Fractal的解决方案是把和原来......
  • 信号与系统(郑君里)第一章-绪论 1-2 课后习题解答
    题目详情(1-2分别判断下列各函数式属于何种信号,即是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?其中各式中n为正整数)答案解析:(1)连续信号模拟信号(2)离散信号抽样信号(3)离散信号数字信号 该函数只取±1,所以为数字信号(4)离散信号抽样信号 该函数随着n的......
  • 信号与系统(郑君里)第一章-绪论 1-3 课后习题解答
    题目详情(分别求下列各周期信号的周期T。)答案解析:tips:本道题考察的是信号的周期性第(1)小题注意连续的找周期找出最小公倍数就可以了,不一定是要整数;第(2)小题注意指数是带有“j”的,如果没有“j”那就不是周期信号了;第(3)小题遇到平方形式第一时间想到用二倍角公式,可以使得形式......
  • 题解:AT_arc190_b [ARC190B] L Partition
    题目传送门很显然每次填完L之后所覆盖的图形为正方形,不然最最后无法填出正方形。现在假设我们已经确定了一个\(k\)阶的L,要求它的方案数。对于\([1,k-1]\)阶L的放法,每阶的\(4\)种方向都对应着一种方案,但\(1\)阶只有\(4\)种都是一样的,所以总方案数为\(4^{k-2}\)......
  • Codeforces 1536B Prinzessin der Verurteilung 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规
    PrinzessinderVerurteilung:最短未出现字符串的板子。思路考虑在SAM上dp,定义\(dp_i\)表示从\(i\)节点走到NULL节点所花费的最少步数。显然我们建出反图,跑DAG上dp即可。转移如下:\[dp_i=1+\min_{j=1}^{|v_i|}dp_{v_{i,j}}\]输出方案的话记录下每个dp值的先驱,最......
  • JS-39 Math 对象
    Math是JavaScript的原生对象,提供各种数学功能。Math.abs()1、Math.abs方法返回参数值的绝对值Math.abs(1)//1Math.abs(-1)//1 2、Math.max(),Math.min()Math.max方法返回参数之中最大的那个值,Math.min返回最小的那个值。如果参数为空,Math.min返回Infinity,Math.max返回-......
  • [CF2057G] Secret Message 题解
    神秘题目。题目的条件十分神奇,\(|A|\le\frac{1}{5}(s+p)\),不知所云。一开始尝试用皮克定理转化,但是failed。阅读理解之后发现有一个(很典)的套路,就是构造出五组方案,使得\(\sum_{cyc}|A|=s+p\),这样就一定有一组方案,面积小于等于$\frac{1}{5}(s+p)$。如何构造?我们发现......
  • AcWing 274. 移动服务 题解
    Tag:线性dp题面link题目描述一个公司有三个移动服务员,最初分别在位置\(1,2,3\)处。如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去。某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工。从\(p\)到\(q\)移动一个员工,需要花费......
  • 第七届传智杯初赛第二场(abc三组)补题+题解python
    文章目录前言A计算商品打折结算金额(B组、C组)B茶杯和球(A组、C组)C游游的字母串(A组、B组、C组)D电梯(B组、C组)E小欧的排列计算(A组、B组、C组)F游游的字母子串(A组、B组、C组)G跳跳跳(A组、B组)H小红的战争棋盘(A组)前言在CSDN上并未找到第七届传智杯......