如何卡掉这种看似n^2的尺取
  • 板块CF652C Foe Pairs
  • 楼主piggy123
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/4/7 16:53
  • 上次更新2023/10/28 04:22:26
查看原帖
如何卡掉这种看似n^2的尺取
380042
piggy123楼主2022/4/7 16:53
#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll n,m,p[500005],vis[500005],lim[500005];

inline ll read() {
	ll x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-') {
			f=-1;
			ch=getchar();
		}
	}
	while(isdigit(ch)) {
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

int main() {
	n=read();m=read();
	for (ll i=1; i<=n; i++) {
		p[i]=read();
		vis[p[i]]=i;
		lim[i]=0x3f3f3f3f3f;
	}
	for (ll j=1; j<=m; j++) {
		// 当包含f时,右端点不能大于vis[t]
		ll f,t;
		f=read();t=read();
		if (vis[f]>vis[t])swap(f,t);
		lim[f]=min(lim[f],vis[t]);
	}
	multiset<ll> ml;
	ll r=0,ans=0;
	for (ll l=1; l<=n; l++) {
		while(r<n&&(ml.empty()||r+1<*ml.begin()))r++,ml.insert(lim[p[r]]);
		ans+=r-l+1;
		ml.erase(ml.find(lim[p[l]]));
	}
	printf("%lld",ans);
	return 0;
}

感觉上一层循环+find是差不多O(n2)O(n^2)的,能否卡掉?如果能卡掉,是否可以使用优化成 O(nlogn)O(n\log n)

2022/4/7 16:53
加载中...