关于这题代码奇怪的UB
查看原帖
关于这题代码奇怪的UB
591179
huangyuxaing楼主2023/9/26 20:08

打的52pts分治做法,不知道为什么,本地运行时样例全过,但是交上去十几遍都是全WA,结果编译警告告诉我是因为分治时[++tp]编译成的未定义操作,改成tp++放在前面就过了,球球大佬帮我看看是什么原因qwq

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int M=4e6+7;
int n,u,ql,qr,a[M],b[M];
int amx[M],bmx[M],tp=0,sum[M],suma[M],sumb[M],q;
int solve(int l,int r){
	if(l==r)return a[l]*b[l];
	//if(r - l == 1) return a[l] * b[l] + a[r] * b[r] + max(a[l],a[r]) * max(b[l],b[r]);
	int mid=(l+r)>>1ULL;
	int res=solve(l,mid)+solve(mid+1,r);
	tp=0;
	for(int i=mid+1;i<=r;i++){
		tp++;
		 amx[tp]=max(amx[tp-1],a[mid+tp]);
		 bmx[tp]=max(bmx[tp-1],b[mid+tp]);
		 sum[tp]=sum[tp-1]+amx[tp]*bmx[tp];
		 suma[tp]=suma[tp-1]+amx[tp];
		 sumb[tp]=sumb[tp-1]+bmx[tp];
	}
	int nowa=0,nowb=0;
	for(int i=mid;i>=l;i--){
		nowa=max(nowa,a[i]);
		nowb=max(nowb,b[i]);
		int konga=upper_bound(amx+1,amx+tp+1,nowa)-amx-1;
		int kongb=upper_bound(bmx+1,bmx+tp+1,nowb)-bmx-1;
		konga=max(konga,0ULL);kongb=max(kongb,0ULL);
		if(konga>kongb){
			res+=kongb*nowa*nowb;
			res+=(sumb[konga]-sumb[kongb])*nowa;
			res+=sum[tp]-sum[konga];
		}else{
			res+=konga*nowb*nowa;
			res+=(suma[kongb]-suma[konga])*nowb;
			res+=sum[tp]-sum[kongb];
		}
	}
	//cout<<l<<" "<<r<<" "<<res<<endl;
	return res;
}
signed main(){
	//freopen("shujv.txt","r",stdin);
	//freopen("std1.txt","w",stdout);
	scanf("%*llu%llu",&n);
	for(int i=1;i<=n;i++){
		scanf("%llu",&a[i]);
	} 
	for(int i=1;i<=n;i++){
		scanf("%llu",&b[i]);
	}
	scanf("%llu",&q);
	while(q--){
		scanf("%llu%llu",&ql,&qr);
		printf("%llu\n",solve(ql,qr));
	}
	return 0;
}
2023/9/26 20:08
加载中...