乱序输入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"; }