how ABC D?
  • 板块学术版
  • 楼主Hot_tear
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/1/27 21:41
  • 上次更新2024/1/27 22:26:34
查看原帖
how ABC D?
737112
Hot_tear楼主2024/1/27 21:41

思路就是找到是用最少的桥梁然后不走

#include<bits/stdc++.h>
#define ll long long
#define F(i,a,b) for(ll i=a;i<=b;i++)
#define R(i,a,b) for(ll i=a;i>=b;i--)
#define sc(a) scanf("%lld",&a)
#define ps(a) printf("%lld ",a)
#define pn(a) printf("%lld\n",a)
using namespace std;
const ll N=3e6+7;
ll n,m,a[N],s[N],ans;
inline ll dis(ll i,ll j){
	ll a=labs(i-j),b=labs(i+n-j);
	if(a<b){
		return 1ll;
	}
	else{
		return 0ll;
	}
}
int main(){
	sc(n),sc(m);
	F(i,1,m) sc(a[i]);
	F(i,2,m){
		ll b=min(a[i],a[i-1]),c=max(a[i],a[i-1]);
		if(dis(b,c)==1ll){
			s[b]++,s[c+1]--;
		}
		else{
			s[1]++,s[b+1]--;
			s[c]++,s[n+1]--;
		}
	}
	ll minn=1e18;
	F(i,1,n) s[i]+=s[i-1],minn=min(minn,s[i]);
	ll ans=0;
	F(i,1,n){
		if(minn==s[i]){
			F(j,2,m){
				ll b=min(a[j],a[j-1]),c=max(a[j],a[j-1]);
				if(dis(b,c)==1ll){
					if(i>=b&&i<c){
						ans+=labs(b+n-c);
					}
					else{
						ans+=labs(b-c);
					}
				}
				else{
					if((i<b&&i>=1)||(i<=n&&i>=c)){
						ans+=labs(b-c);
					}
					else{
						ans+=labs(b+n-c);
					}
				}
			}
			break;
		}
	}
	pn(ans);
	return 0;
}

2024/1/27 21:41
加载中...