题意:
两次操作,
前缀排序,后缀排序各一次
每次操作花费排序长度的平方,问什么如何排序花费最小?
思路:
简单讲,先后面找一下,再前面找一下,然后记得一下,就过了
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
void ts(){cout<<"IAKIOI"<<endl;}
const int N=1e6+5;
int n, c[N], ans, vis[N];
struct node{
int x, id;
}a[N];
bool cmp(node a, node b){
return a.x==b.x?a.id<b.id:a.x<b.x;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i].x, a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++)c[a[i].id]=i;
ans=n*n;
int j=0;
for(int i=1; i<=n; i++){
while(j<n&&vis[j]||(c[j]==j))j++;
ans=min(ans,(i-1)*(i-1)+(n-j+1)*(n-j+1));
vis[c[i]]=1;
}
memset(vis,0,sizeof vis);
j=n;
for(int i=n; i; i--){
while(j&&vis[j]||(c[j]==j))j--;
ans=min(ans,(n-i)*(n-i)+j*j);
vis[c[i]]=1;
}
cout<<ans<<'\n';
return 0;
}
水话:
今天虽然预留了蛮多时间,但是结果只写了3题...而且代码都没时间来得及写。滚去读书了

浙公网安备 33010602011771号