社区讨论
求调||栈做法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 条回复,欢迎继续交流。
正在加载回复...