感觉复杂度正确但常数略大,不知为什么 TLE。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+5;
int a[N];
int n,ans;
vector<int>v,v2;
map<int,int>ds,ds2;
int find(int x){
int l=0,r=v.size()-1,mid;
while(l<=r){
mid=l+r>>1;
if(v[mid]<x&&v[mid+1]>x){
return mid+1;
}
if(v[mid]<x){
l=mid+1;
}
else{
r=mid-1;
}
}
return l;
}
int find2(int x){
int l=0,r=v2.size()-1,mid;
while(l<=r){
mid=l+r>>1;
if(v2[mid]<x&&v2[mid+1]>x){
return mid+1;
}
if(v2[mid]<x){
l=mid+1;
}
else{
r=mid-1;
}
}
return l;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
int pos=find(a[i]);
ds[a[i]]+=pos;
v.insert(upper_bound(v.begin(),v.end(),a[i]),a[i]);
}
for(int i=n;i>=1;i--){
int pos=find2(-a[i]);
ds2[-a[i]]+=pos;
v2.insert(lower_bound(v2.begin(),v2.end(),-a[i]),-a[i]);
}
for(auto it=ds.begin();it!=ds.end();it++){
ans+=(*it).first*(*it).second;
}
for(auto it=ds2.begin();it!=ds2.end();it++){
ans+=(*it).first*(*it).second;
}
cout<<ans;
return 0;
}
并求一下这题正解