社区讨论
为何我本地没事,提交就总CE(玄关,跪求
P14567【MX-S12-T2】区间参与者 3已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @mi9x0kef
- 此快照首次捕获于
- 2025/11/22 14:35 3 个月前
- 此快照最后确认于
- 2025/11/22 15:37 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+20;
int n,cc;
long long ans=1e11;
int w[N],f[N],id[N],co[N];
bool vis[N];
struct Node{
int l=1e7,r=-1e7;
}c[N];
struct NN{
int mi=1e7,ma=-1e7,tmi,tma;
}tr[N*4];
void pushdown(int x){
int mi=tr[x].tmi,ma=tr[x].tma;tr[x].tma=tr[x].tmi=0;
if(!mi&&!ma)return;
int ls=x<<1,rs=x<<1|1;
tr[ls].ma=max(tr[ls].ma,ma),tr[ls].mi=min(tr[ls].mi,mi);
tr[ls].tma=max(tr[ls].tma,ma),tr[ls].tmi=(tr[ls].tmi==0?mi:min(tr[ls].tmi,mi));
tr[rs].ma=max(tr[rs].ma,ma),tr[rs].mi=min(tr[rs].mi,mi);
tr[rs].tma=max(tr[rs].tma,ma),tr[rs].tmi=(tr[rs].tmi==0?mi:min(tr[rs].tmi,mi));
}
void pushup(int x){
int ls=x<<1,rs=x<<1|1;
tr[x].ma=max(tr[ls].ma,tr[rs].ma);
tr[x].mi=min(tr[ls].mi,tr[rs].mi);
}
void modify(int x,int l,int r,int L,int R,int mi,int ma){
if(L<=l&&r<=R){
tr[x].ma=max(tr[x].ma,ma);
tr[x].mi=min(tr[x].mi,mi);
tr[x].tmi=(tr[x].tmi==0?mi:min(tr[x].tmi,mi));
tr[x].tma=(tr[x].tma==0?ma:max(tr[x].tma,ma));
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid)modify(x<<1,l,mid,L,R,mi,ma);
if(mid<R)modify(x<<1|1,mid+1,r,L,R,mi,ma);
pushup(x);
}
NN query(int x,int l,int r,int L,int R){
if(L<=l&&r<=R)return tr[x];
pushdown(x);
NN res,kk;
int mid=(l+r)>>1;
if(L<=mid){
kk=query(x<<1,l,mid,L,R);
res.ma=max(res.ma,kk.ma);
res.mi=min(res.mi,kk.mi);
}
if(mid<R){
kk=query(x<<1|1,mid+1,r,L,R);
res.ma=max(res.ma,kk.ma);
res.mi=min(res.mi,kk.mi);
}
return res;
}
bool cmp(Node x,Node y){return x.r<y.r;}
int main(){
scanf("%d",&n);
for(int i=1,x,cl;i<=n;i++){
scanf("%d",co+i);x=co[i];
if(!id[x])cl=id[x]=(++cc);
else cl=id[x];
c[cl].l=min(c[cl].l,i);
c[cl].r=max(c[cl].r,i);
}
for(int i=1;i<=n;i++)scanf("%d",w+i);
for(int i=1;i<=n;i++)scanf("%d",f+i);
for(int i=1;i<=n;i++)modify(1,1,n,i,i,c[id[co[i]]].l,c[id[co[i]]].r);
sort(c+1,c+1+cc,cmp);
for(int i=1;i<=cc;i++){
int l=c[i].l,r=c[i].r;
NN q=query(1,1,n,l,r);
while(q.mi!=l){
l=q.mi;
q=query(1,1,n,l,r);
}
while(q.ma!=r){
r=q.ma;
q=query(1,1,n,l,r);
}
long long an=0;
for(int i=l;i<=r;i++)an+=w[i]*f[i-l+1];
ans=min(an,ans);
}
printf("%lld",ans);
return 0;
}
这是改后版本
原版的全开了LL,然后CE,我把N社为了1e5,又可以了
我就怀疑是太大了,然后我全改成int,也可以提交,可答案超过了int,就WA掉了
然后就只把ans相关几个变量改成了LL,结果又CE
理由是我在query函数的变量res和kk未初始化??
原版的全开了LL,然后CE,我把N社为了1e5,又可以了
我就怀疑是太大了,然后我全改成int,也可以提交,可答案超过了int,就WA掉了
然后就只把ans相关几个变量改成了LL,结果又CE
理由是我在query函数的变量res和kk未初始化??
回复
共 12 条回复,欢迎继续交流。
正在加载回复...