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;
}

浙公网安备 33010602011771号