社区讨论

为何我本地没事,提交就总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未初始化??

回复

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

正在加载回复...