WA on text 22 求条 玄关
查看原帖
WA on text 22 求条 玄关
750943
Timmylyx楼主2024/12/6 16:14
#include <bits/stdc++.h> 
using namespace std;
#define lb (id&-id)
#define int long long
int a[1000010],b[1000010],c[1000010],mn[1000010];
void insert(int id){
	while (id<=1000005){
		c[id]++; id+=lb;
	}
}int ask(int id){
	int ans=0;
	while (id>0) ans+=c[id],id-=lb;
	return ans;
}signed main(){
	set<int> st; map <int,int> mp; st.insert(1e18);
	int n,tot=0,ans=1e18,sta=1,mx=0; cin>>n;
	for (int i=1; i<=n; i++){
		cin>>a[i]; b[i]=a[i];
		st.insert(a[i]);
	}sort(b+1,b+n+1); mn[n+1]=1e18; b[n+1]=1e18;
	for (auto x:st) mp[x]=++tot;
	for (int i=n; i>=1; i--){
		mn[i]=min(mn[i+1],a[i]);
	}for (int i=1; i<=n+1; i++){
		if (a[i]!=b[i]){
			if(a[i-1]==b[i-1]&&mx<=mn[i])
			ans=min(ans,(sta-1)*(sta-1)+(n-i+1)*(n-i+1)); 
			sta=i+1; 
		}mx=max(mx,a[i]);
	}for (int i=1; i<=n; i++){
		insert(mp[a[i]]);
		int l=0,r=i;
		while (l<r-1){
			int mid=(l+r)/2;
			if (ask(mp[b[mid]])>=mid) l=mid;
			else r=mid;
		}if (ask(mp[b[r]])>=r) ans=min(ans,i*i+(n-r)*(n-r));
		else if (ask(mp[b[l]])>=l) ans=min(ans,i*i+(n-l)*(n-l));
	}memset(c,0,sizeof(c));
	reverse(a+1,a+n+1);
	for (int i=1; i<=n; i++){
		insert(n-mp[a[i]]+1);
		int l=0,r=i;
		while (l<r-1){
			int mid=(l+r)/2;
			if (ask(n-mp[b[n-mid+1]]+1)>=mid) l=mid;
			else r=mid;
		}if (ask(n-mp[b[n-r+1]]+1)>=r) ans=min(ans,i*i+(n-r)*(n-r));
		else if (ask(n-mp[b[n-l+1]]+1)>=l) ans=min(ans,i*i+(n-l)*(n-l));
	}cout<<ans;
	
	return 0;
}
2024/12/6 16:14
加载中...