求助MX-J8T2,码风优良,复杂度假了但不知道为什么
  • 板块学术版
  • 楼主_8008008
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/20 12:13
  • 上次更新2024/10/20 14:01:10
查看原帖
求助MX-J8T2,码风优良,复杂度假了但不知道为什么
803885
_8008008楼主2024/10/20 12:13
#include<iostream>
#define int long long
using namespace std;
const int maxn=3000050;
const int mod=1000000007;
int n,m[maxn],a[maxn];
int val(int i,int k){
	return (k<=m[i]-a[i])+(k<=a[i]-1);
}
int two[maxn],one[maxn];
void bisec(int i){//O(log m)
	int l=0,r=m[i];
	while(l<r){
		if(r-l<=5)break;
		int mid=(l+r)/2;
		if(val(i,mid)==2)l=mid;
		else r=mid-1;
	}
	for(int j=r;j>=l;j--){
		if(val(i,j)==2){
			two[i]=j;
			return;
		}
	}
}
void bisec2(int i){//O(log m)
	int l=0,r=m[i];
	while(l<r){
		if(r-l<=5)break;
		int mid=(l+r)/2;
		if(val(i,mid)>=1)l=mid;
		else r=mid-1;
	}
	for(int j=r;j>=l;j--){
		if(val(i,j)>=1){
			one[i]=j;
			return;
		}
	}
}
int find1(int k){//O(n)
	int ans=0;
	for(int i=1;i<=n;i++){
		if(two[i]<k&&k<=one[i])ans++;
	}
	return ans;
}
int maxtop=1e18;
int bisec3(int x){//最小的有 x个 1 的 k 
	int l=1,r=maxtop;
	while(l<=r){
		if(r-l<=5)break;
		int mid=(l+r)/2;
		if(find1(mid)>=x)r=mid-1;
		else l=mid;
	}
	for(int i=l;i<=r;i++){
		if(find1(i)==x){
			return i;
		}
	}
	return -1;//没有 
}
int bisec4(int x){//最大的有 x个 1 的 k 
	int l=1,r=maxtop;
	while(l<=r){
		if(r-l<=5)break;
		int mid=(l+r)/2;
		if(find1(mid)>x)r=mid-1;
		else l=mid;
	}
	for(int i=r;i>=l;i--){
		if(find1(i)==x){
			return i;
		}
	}
	return -1;//没有 
}
int qpow(int x,int y){
	if(y==0)return 1;
	if(y==1)return x%mod;
	int c=qpow(x,y/2);
	int ans=(c*c%mod)*(y%2?x:1)%mod;
	return ans%mod;
}
int ans=0;
void deal(int x){//有 x 个 1 的情况 
	int l=bisec3(x),r=bisec4(x);
	if(l==-1||r==-1)return;//不存在
	ans+=qpow(2,n-x)*(r-l+1)%mod;
	ans%=mod;
}
signed main(){
	freopen("hole7.in","r",stdin);
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&m[i]);
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<=n;i++){
		bisec(i);
		bisec2(i);
		maxtop=min(maxtop,one[i]);
	}
	for(int i=0;i<=n;i++){
		deal(i);
	}
	printf("%lld",(ans+1)%mod);
	return 0;
}

main函数

for(int i=0;i<=n;i++){
	deal(i);
}

假掉了
请问为什么会假

2024/10/20 12:13
加载中...