Connecting...

Problem - 2128D - Codeforces

Problem - 2128D - Codeforces

显然不能 \(O(n^2)\) 枚举区间并求答案。

考虑贡献。

观察样例。第一个样例是降序,好算。

我们思考题目的序列有什么性质,可能会让我们可以 \(O(n)\) 求贡献。

我们知道答案因为相邻两数升序而减少。

考虑每对“逆序对”贡献了几个区间。

尝试样例,惊奇发现只要静态扫一遍序列求贡献就行。怎么证明,我不会。

CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=5e5+10;
int n,a[N],dp[N][2];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int t;cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;++i)cin>>a[i];
		int ans=0;
		for(int i=1;i<=n;++i){
			ans+=i*(n-i+1);
			if(i!=n&&a[i]<a[i+1]) ans-=i*(n-i);
		} 
		cout<<ans<<"\n";
	}
	
	return 0;
}
posted @ 2025-07-28 18:40  余亦宸  阅读(16)  评论(0)    收藏  举报