yuwj  

题意:
两次操作,
前缀排序,后缀排序各一次
每次操作花费排序长度的平方,问什么如何排序花费最小?

思路:
简单讲,先后面找一下,再前面找一下,然后记得一下,就过了

代码:

#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题...而且代码都没时间来得及写。滚去读书了

posted on 2025-04-15 23:30  xiaowang524  阅读(13)  评论(0)    收藏  举报