QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#404631 | #8552. Sticks | OvO_Zuo | TL | 1ms | 5860kb | C++14 | 1.7kb | 2024-05-04 10:51:51 | 2024-05-04 10:51:53 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3005,mo=998244353;
int n;
char s[N][N];
int dp[N][N];
int add(int x,int y) {x+=y;return x>=mo?x-mo:x;}
int suf[N];
int mn[N],mx[N];
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++) scanf("%s",s[i]+1);
fill(mx,mx+1+n,0);
fill(mn,mn+1+n,n+1);
for(i=n;i>=1;--i)
for(j=1;j<=n;j++)
if(s[i][j]=='0') mn[j]=i;
for(i=0;i<=n;i++) dp[0][i]=1;
int lst,mn0;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++)
if(s[i][j]=='1') mx[j]=i;
for(j=1;j<=n;j++) {
suf[j+1]=1;
for(k=j;k>1;--k)
suf[k]=(ll)suf[k+1]*max(0,min(i+1,mn[k])-mx[k])%mo;
for(mn0=j+1,k=j;k>=1;k--)
if(s[i][k]=='0') mn0=k;
for(lst=0,k=1;k<=j;k++) {
if(mn[k]>i) {
// cout<<i<<" "<<j<<" "<<k<<" "<<mn0<<" "<<lst<<" "<<dp[i-1][k-1]<<" "<<suf[k+1]<<endl;
dp[i][j]=add(dp[i][j],
(ll)dp[i-1][k-1]*suf[k+1]%mo*
max(0,min(k-1,mn0)-lst)%mo);
}
if(s[i][k]=='1') lst=k;
}
// cout<<"lst:"<<i<<" "<<j<<" "<<mn0<<" "<<lst<<" "<<dp[i-1][j]<<endl;
dp[i][j]=add(dp[i][j],(ll)max(0,(mn0-lst))*dp[i-1][j]%mo);
// cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
}
}
printf("%d\n",dp[n][n]);
return 0;
}
/*
问:有多少个 n*n 的 01 矩形 A 满足能找到一组 x[1~n],y[1~n]
其中一些位置的 01 已经给定
满足 不存在 x[i]>=j&&y[j]>=i 且 A[i][j] = [(x[i]>=j)||(y[j]>=i)]
考虑判断一个 A 矩阵是否合法
每次尝试删掉最后一行
显然令最后一行的 x[n] 尽量大,找到最小的 p>x[n]+1 满足 A[n][p] = 1
显然第 p 列的 y[p] 应 = n, p~m 列可以自由选择
问题变成 n-1 * p
转移时只枚举 p 即可
*/
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 5860kb
input:
2 ?? ??
output:
14
result:
ok 1 number(s): "14"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3840kb
input:
5 ??1?? ?1??0 ??0?? ???1? ??1??
output:
3144
result:
ok 1 number(s): "3144"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3984kb
input:
10 0000000000 ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ??????????
output:
361458985
result:
ok 1 number(s): "361458985"
Test #4:
score: -100
Time Limit Exceeded
input:
3000 ??????????????????????????????????????????????????????????0?????????????????????0??????????????????????????????????????????????????????????????????????????????????????0???????????????????????????????????????????0???????????????????????????????????????????????????????????????????????????????????...