刚才AT D题做法求调/dk
  • 板块学术版
  • 楼主After_light
  • 当前回复15
  • 已保存回复15
  • 发布时间2022/11/12 21:49
  • 上次更新2023/10/27 03:11:02
查看原帖
刚才AT D题做法求调/dk
554803
After_light楼主2022/11/12 21:49
#include<bits/stdc++.h>
#define ll long long
#define FOR(i,a,b) for(ll i=a;i<=b;i++)
#define ROF(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 a[N],n,c[N],cnt,sum=999999999999999,vis[N];
ll bu[N],f[N],len,m;
queue<ll> q;
bool can[N];
inline ll bfs(ll now){
	while(q.size()) q.pop();
	q.push(now);
	ll sum=0;
	while(q.size()){
		ll tmp=q.front();
		sum+=vis[tmp];
		q.pop();
		if((can[bu[tmp]+1]||can[(bu[tmp]+1)%m])){
			ll kk=tmp+1;
			if(!can[bu[tmp]+1]) kk=(tmp+1)%m;
			if(f[kk]!=-1){
				sum+=f[kk];
				return sum;
			}
			q.push(kk);
		}
	}
	return sum;
}
int main(){
	memset(f,-1,sizeof(f));
	sc(n),sc(m);
	ll summ=0;
	FOR(i,1,n) sc(a[i]),c[++cnt]=a[i],summ+=a[i];
	sort(c+1,c+cnt+1);
	ll len=unique(c+1,c+cnt+1)-c-1;
	FOR(i,1,len){
		bu[i]=c[i];
		can[c[i]]=true;
	}
	FOR(i,1,n){
		a[i]=lower_bound(c+1,c+len+1,a[i])-c;
		vis[a[i]]+=bu[a[i]];
	}
	FOR(i,1,n){
		if(f[a[i]]!=-1) continue;
		f[a[i]]=bfs(a[i]);
	}
	ll anss=99999999999999;
	FOR(i,1,n){
		anss=min(anss,summ-f[a[i]]);
	} 
	pn(anss);
	return 0;
}

WA+TLE+AC 求帮

2022/11/12 21:49
加载中...