专栏文章

题解:CF2126D This Is the Last Time

CF2126D题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miotrx1q
此快照首次捕获于
2025/12/03 01:01
3 个月前
此快照最后确认于
2025/12/03 01:01
3 个月前
查看原文
[Translation]\color{blue}{\texttt{[Translation]}}
你有一个初始硬币价值 kknn 个操作,每个操作形如 [li,ri,reali][l_{i},r_{i},\text{real}_{i}]。对于每个操作,如果你当前的硬币价值满足 licurril_{i} \leq \text{cur} \leq r_{i},则你的硬币价值变成 reali\text{real}_{i}。你可以按任意次序进行任意次操作,求最终最大的可能的硬币价值。
1n1×105,lirealiri1 \leq n \leq 1 \times 10^{5},l_{i} \leq \text{real}_{i} \leq r_{i}
Translated by HPXXZYY.
[Analysis]\color{blue}{\texttt{[Analysis]}}
贪心。
显然,rir_{i} 对于我们是没有用的,因为当 cur>reali\text{cur}>\text{real}_{i} 时就算满足条件你也不会进行操作;当 cur<reali\text{cur}<\text{real}_{i} 时,cur\text{cur} 当然也小于 rir_{i}。所以,我们将操作化简为 [li,Ri][l_{i},R_{i}],其中 Ri=realiR_{i}=\text{real}_{i},当 licurRil_{i}\leq \text{cur} \leq R_{i} 时,可以将 cur\text{cur} 变成 RiR_{i}
按操作的 ll 从小到大进行排序,如果 curli\text{cur} \geq l_{i},就贪心的进行操作,最终答案一定最优。
为什么这样贪心是正确的呢?是否有这样的可能,我们需要先进行某次操作 vv 使得 cur\text{cur} 变小,进入另一个操作 uu 的区间,再通过操作 uu 使得 cur\text{cur} 变大?
其实是有这样的可能的,但是这道题不会。核心的原因在于 realiri\text{real}_{i}\leq r_{i}
最开始 cur\text{cur} 不在 uu 的操作区间的原因是 cur>ru\text{cur}>r_{u},即使我们最终通过一系列花里胡哨的操作使得 cur\text{cur}^{'} 进入了 uu 的可操作区间 [lu,ru][l_{u},r_{u}]cur>rurealu\text{cur}>r_{u}\geq \text{real}_{u},最终变劣了。
Code\color{blue}{\text{Code}}
CPP
int T,n,k,l[N],r[N],order[N];
 
bool cmp(int u,int v){
	if (l[u]==l[v])
		return r[u]>r[v];
	return l[u]<l[v];
}
 
int main(){
	T=read();
	while (T--){
		n=read();k=read();
		for(int i=1;i<=n;i++){
			l[i]=read();
			read();
			r[i]=read();
			order[i]=i;
		}
		
		sort(order+1,order+n+1,cmp);
		
		for(int i=1;i<=n;i++)
			if (l[order[i]]<=k&&k<=r[order[i]])
				k=r[order[i]];
		
		printf("%d\n",k);
	}
	
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...