【求助】救救孩子吧,改了一周了
查看原帖
【求助】救救孩子吧,改了一周了
762019
yushanxuanfeng楼主2023/4/12 20:51
#include<bits/stdc++.h>
using namespace std;
int n,m,z,kmax=0,mod=10000007;
int a[1005][1005][35],b[2005][2005],dp1[1005][1005],dp0[1005][1005],h[2005];
long long ans1=0,ans0=0;
string s;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&z);
//			cout<<"z="<<z;
			for(int k=1;z;k++,z/=2){
				if(z&1)a[i][j][k]=1;
				kmax=max(kmax,k);
			}
		}
	}
	for(int k=1;k<31;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(a[i][j][k]) dp1[i][j]=dp1[i][j-1]+1,dp0[i][j]=0;
				else dp1[i][j]=0,dp0[i][j]=dp0[i][j-1]+1;
			}
		}
//		for(int i=1;i<=n;i++){
//			for(int j=1;j<=n;j++){
//				cout<<dp0[i][j]<<" ";
//			}
//			cout<<endl;
//		}
//		cout<<endl;
		long long ans=0;
		for(long long j=1,x=0,sum=0;j<=n;j++,x=0,sum=0){
			for(int i=1;i<=n;i++){
//				if(a[i][j][k]) continue;
				sum+=dp0[i][j];
				while(x&&dp0[h[x]][j]>=dp0[h[x]][j]){
					sum-=(h[x]-h[x-1])*(dp0[h[x]][j]-dp0[i][j]);
					x--;
				} 
				ans0+=(i*j-sum)<<(k-1);
				ans0%=mod;
				h[++x]=i;
			}
		}	
//		cout<<"ans0="<<ans0<<endl;
//		ans0=(ans0+(m
		ans=0;
		for(long long j=1,x=0,sum=0;j<=n;j++,x=0,sum=0){
			for(int i=1;i<=n;i++){
//				if(a[i][j][k]==0) continue;
				sum+=dp1[i][j];
				while(x&&dp1[i][j]<=dp1[h[x]][j]){
					sum-=(h[x]-h[x-1])*(dp1[h[x]][j]-dp1[i][j]);
					x--;
				} 
				ans1+=sum<<(k-1);
				ans1%=mod;
				h[++x]=i;
//				cout<<ans<<" ";
			}
//			cout<<endl;
		}
//		ans1=(ans1+ans*(1<<(k-1)))%mod;-ans)*(1<<(k-1)))%mod;	
	}

	cout<<ans1<<" "<<ans0<<endl;
}

/*
4
0 1 1 1
0 1 1 1
0 0 0 0
0 0 0 0

*/

提交20分,WA4个T4个,有没有大佬帮看看哪里出bug了)感激不尽QAQ

调了一周了,人已经麻了,现在开始胡言乱语()

2023/4/12 20:51
加载中...