专栏文章

CF2104B Move to the End

CF2104B题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mip7ip22
此快照首次捕获于
2025/12/03 07:26
3 个月前
此快照最后确认于
2025/12/03 07:26
3 个月前
查看原文

题目传送门

思路

由于每次操作只能移动一个数到序列末尾,所以第 ii 次询问中 ani+2ana_{n-i+2} \sim a_n 的所有数是一定在答案中的,此时我们只需要再求出 a1ani+1a_1 \sim a_{n-i+1} 中的最大值即可,可以维护前缀最大值和前缀和来进行询问。我们规定 maxximaxx_ia1aia_1 \sim a_i 中所有数的最大值,sumisum_ia1aia_1 \sim a_i 中所有数的总和。那么第 ii 次询问的答案就是 sumnsumni+1+maxxni+1sum_n-sum_{n-i+1}+maxx_{n-i+1}
这时的代码总时间复杂度为 O(tn)O(tn)
注:sumsum 数组要开 long long

AC Code:

CPP
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N];
long long sum[N];
int maxx[N];
void solve()
{
	int n;
	cin >>n;
	for(int i=1;i<=n;i++)
	{
		cin >>a[i];
		sum[i]=sum[i-1]+a[i];
		maxx[i]=max(maxx[i-1],a[i]);
	}
	for(int i=1;i<=n;i++)
	{
		cout <<(sum[n]-sum[n-i+2-1])+maxx[n-i+1]<<" ";
	}
	cout <<'\n';
}
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

评论

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

正在加载评论...