社区讨论

求调||栈做法84ptsWA 146ms

P14567【MX-S12-T2】区间参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mia18btc
此快照首次捕获于
2025/11/22 16:33
3 个月前
此快照最后确认于
2025/11/22 18:15
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>//4e7~5e7 2s     评测时间? 
using namespace std;
const int N=1e6+5;
typedef long long ll;
int n,c[N],cmax[N],cmin[N],L;
ll v[N],f[N],ans=2e18;
int st[N],top,s[N],t;
void solve(int l,int r){
//	cout<<l<<' '<<r<<'\n';
	ll sum=0;
	for(int i=l;i<=r;i++){
		sum+=v[i]*f[i-l+1];
	}
	ans=min(ans,sum);
}
bool check(int l,int r){
	int i=t,minn=l;
	L=l;
	vector<int> b;
	while(i){
		if(s[i]==l)break;
		if(c[s[i]]==c[r]){
			i--;
		}else{
			b.push_back(c[s[i]]);
			minn=cmin[c[s[i]]];
			i--;
		}
	}
	for(int i=minn;i<l;i++){
		int id=lower_bound(b.begin(),b.end(),c[i])-b.begin();
		if(id==b.size())return 0;
		if(b[id]==c[i]){
			continue;
		}return 0;
	}
	L=minn;
	return 1;
}
void del(int l,int r){
	while(t){
		if(s[t]==l){
			t--;
			break;
		}
		t--;
	}
}
int main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout); 
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>c[i]; 
		cmax[c[i]]=max(cmax[c[i]],i);
		if(cmin[c[i]]==0)cmin[c[i]]=i;
	}
	for(int i=1;i<=n;i++){
		cin>>v[i];
	}
	for(int i=1;i<=n;i++){
		cin>>f[i];
	}
//	for(int i=1;i<=n;i++){
//		cout<<cmin[c[i]]<<' '<<cmax[c[i]]<<'\n';
//	}
	top=0;
	int maxn=0; 
	for(int i=1;i<=n;i++){//合法区间 
	    s[++t]=i;
		if(i!=cmin[c[i]]&&i!=cmax[c[i]])continue;
		if(i==cmin[c[i]]&&i==cmax[c[i]]){//1
			solve(i,i);
			t--;
			continue;
		}
	    if(top==0||cmin[c[i]]==i){
	    	st[++top]=i;
//	    	cout<<i<<'\n';
	    	maxn=max(maxn,cmax[c[i]]);
	    	continue;
		}
		if(i==maxn){
			solve(st[1],i);
			top=0;
			t=0;
		}else if(i==cmax[c[st[top]]]){
			if(check(st[top],i)){
			    solve(L,i);
			    del(L,i);
			    while(top){
			    	if(s[top]==L){
			    		top--;
			    		break;
					}
			    	top--;
				}
			}
		}
	}
	cout<<ans<<'\n';
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...