乱序输入n个数,从头开始取 如果这个是最小的(在现在的数组中)就删除否则放到最后面 问需要取几次才能把全部删除
1 ≤ n ≤ 100 000,1 ≤ ai ≤ 100 000
方法一 :
分析每次都是先把最小的取出再取次小的数 所以以最右的的最小值为分界线 左边次小的次数为dis(初始时为1每循环一次加一),而右边的尾dis+1(需要循环一次才能取到),所以时间复杂度为O(ai)
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
vector<int>vec[MAX+6];
int n;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
vec[x].push_back(i);
}
long long ans=0,p=0,dis=1;
for(int i=1;i<=MAX;i++){
if(vec[i].empty()) continue;
vector<int>::iterator iter =lower_bound(vec[i].begin(),vec[i].end(),p);
ans+=dis*(vec[i].end()-iter);
// cout<<ans<<endl;
p=vec[i].back();
vec[i].erase(iter,vec[i].end());
if(vec[i].size()){
p=0;
dis++;
i--;
}
}
cout<<ans<<"\n";
}

京公网安备 11010502036488号