社区讨论

玄关!不是很懂,在本地测能90pts,luogu上就只能a3个点

P8865[NOIP2022] 种花参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi3yixf8
此快照首次捕获于
2025/11/18 10:31
4 个月前
此快照最后确认于
2025/11/18 23:50
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ma[1005][1005];
int r;
int last[1005];
int shuf[10005][1005];
int shu[1005][1005];
int heng[1005][1005];//f[i][j]:第i行第j列开始,往后找到第一个1的位置-j 
int p=998244353;
void read(int &x){
	int t=0;
	char a=getchar();
	while(a<48||a>57){
		a=getchar();
	}
	while(a<=57&&a>=48){
		t=t*10+a-48;
		a=getchar();
	}
	x=t;
}
void write(int x){
	if(x>9) write(x/10);
	putchar(x%10+48);
}
int T,id,n,m,c,f;
signed main(){
	read(T);
	read(id);
	while(T--){
		read(n);read(m);read(c);read(f);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				char a=getchar();
				ma[i][j]=a-48;
			}
			getchar();
		}
		for(int j=1;j<=m;j++){
			for(int i=1;i<=n;i++){
				shu[i][j]=shu[i-1][j]+ma[i][j];
			}
		}
		for(int i=1;i<=n;++i){
			r=0;
			for(int j=1;j<=m;++j){
				if(ma[i][j]==1){
					while(r){
						heng[i][last[r--]]=j-last[r+1];
					}
				}
				else last[++r]=j;
			}
			while(r){
				heng[i][last[r--]]=m+1-last[r+1];
			}
		} 
		for(int j=1;j<=m;++j){
			r=0;
			for(int i=1;i<=n;++i){
				if(ma[i][j]==1){
					while(r){
						shuf[last[r--]][j]=i-last[r+1];
					}
				}
				else last[++r]=i;
			}
			while(r){
				shuf[last[r--]][j]=n+1-last[r+1];
			}
		} 
		int cntc=0,cntf=0;
		if(c)
		for(int i=1;i<n;++i){
			for(int k=1;k<m;++k){
				for(int j=i+2;j<=n;++j){
					if(shu[j][k]-shu[i-1][k]!=0) break;
					if(ma[i][k+1]==ma[j][k+1]&&ma[i][k+1]==0){
						int aa=heng[i][k+1];
						int bb=heng[j][k+1];
						cntc=(cntc+(aa*bb)%p)%p;
				//		cout<<i<<" "<<j<<" "<<k<<" "<<aa<<" "<<bb<<endl;	
					}
				}
			}
		}
		if(f)
		for(int i=1;i<n;i++){
			for(int k=1;k<m;k++){
				for(int j=i+2;j<n;j++){
					if(ma[j+1][k]==1) break;
					if(shu[j][k]-shu[i-1][k]!=0) break;
					if(ma[i][k+1]==ma[j][k+1]&&ma[i][k+1]==0){
						int aa=heng[i][k+1];
						int bb=heng[j][k+1];
						int cc=shuf[j+1][k];
						cntf=(cntf+(((aa*bb)%p)*cc)%p)%p;
					}
				}
			}
		}
		write(cntc*c);putchar(' ');
		write(cntf*f);putchar('\n');
	}
}

/*
1 0
4 3 1 1
001
010
000
000
*/

回复

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

正在加载回复...