[COCI 2025/2026 #5] 五步 / Pet 题解
思路和 [ICPC 2025 APC] Control Towers 非常相像的一道题。
先弱化一下不能重复经过同一片荷叶的限制,直接算跳
尝试思考什么时候会算重。发现只有一种情况,就是经过了四个形成矩形的位置,最后跳回了原位。问题变为了求出有多少对 bitset 来求,这一部分的时间复杂度为
综上,时间复杂度为 __int128。
放代码:
#include<bits/stdc++.h>
using namespace std;
typedef __int128 ll;
typedef bitset<2000> B;
void write(ll x){
if(x>9)write(x/10);
cout<<(char)(x%10+48);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,m; cin>>n>>m;
vector<string> s(n);
for(auto &i:s)cin>>i;
vector f(n,vector<array<ll,2> >(m));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
f[i][j][0]=f[i][j][1]=s[i][j]&1;
for(int r=1;r<5;r++){
vector<ll> rs(n),cs(m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
rs[i]+=f[i][j][0],cs[j]+=f[i][j][1];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(s[i][j]&1){
ll x=f[i][j][0],y=f[i][j][1];
f[i][j][0]=cs[j]-y,f[i][j][1]=rs[i]-x;
}
} // DP 部分
ll c=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
c+=f[i][j][0]+f[i][j][1];
vector<B> b(n);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(s[i][j]&1)b[i].set(j);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
int x=(b[i]&b[j]).count();
c-=x*(x-1)*4;
} // 扣掉算重的部分
write(c),cout<<endl;
return 0;
}