社区讨论
根号分治做法WA求调
AT_abc259_h [ABC259Ex] Yet Another Path Counting参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m3pwgpy0
- 此快照首次捕获于
- 2024/11/20 21:08 去年
- 此快照最后确认于
- 2024/11/20 23:26 去年
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=405,sqrn=405;
const ll mod=998244353;
int n;
ll dp[sqrn][N][N];
ll a[N][N];
ll tj[N*N];
ll tag[N],len;
vector<int> gx[N*N],gy[N*N];
ll pf[N][N];
int main(){
cin >>n;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
for(int k=1;k<=400;k++)dp[k][i][j]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
gx[a[i][j]].push_back(i);
gy[a[i][j]].push_back(j);
tj[a[i][j]]++;
if(i==1 && j==1)pf[i][j]=1;
else pf[i][j]=(pf[i-1][j]+pf[i][j-1])%mod;
}
}
for(int i=1;i<=n*n;i++){
if(tj[i]>400)tag[i]=++len;
}
ll ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!tag[a[i][j]]){
for(int k=0;k<gx[a[i][j]].size();k++){
int dx=i-gx[a[i][j]][k],dy=j-gy[a[i][j]][k];
if(dx>=0 &&dy>=0){
ans=(ans+pf[dx+1][dy+1])%mod;
}
}
}else{
dp[tag[a[i][j]]][i][j]=1;
dp[tag[a[i][j]]][i][j]+=dp[tag[a[i][j]]][i-1][j];
dp[tag[a[i][j]]][i][j]+=dp[tag[a[i][j]]][i][j-1];
dp[tag[a[i][j]]][i][j]%=mod;
ans=(ans+dp[tag[a[i][j]]][i][j])%mod;
}
}
}
cout<<ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...