题目链接
每个位置的最小值是由左右位置转移过来的,所以排序后,当前位置i左右两边的位置如果已经计算过,就可以转移过来 nlogn
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int N=1e5+10;
int a[N],b[N];
P child[N];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
child[i]={a[i],i};
}
sort(child,child+n);
for(int i=0;i<n;i++){
auto c=child[i];
int left=(c.second-1+n)%n,right=(c.second+1)%n; //环状处理
int lv=1,rv=1;
if(c.first>a[left]) lv=b[left]+1;
if(c.first>a[right]) rv=b[right]+1;
b[c.second]=max(lv,rv);
}
ll res=0;
for(int i=0;i<n;i++){
res+=b[i];
}
cout<<res<<endl;
}
}
记忆话搜索 n
链接