社区讨论
玄关!不是很懂,在本地测能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 条回复,欢迎继续交流。
正在加载回复...