【题解】P9737 [COCI 2022/2023 #2] Lampice

· · 题解

题意

n+1m+1 列的矩阵上有 k 种不同的数字,每种有 2 个,求满足如下条件的子矩阵个数:

注意到 n 的值较小,故考虑枚举子矩阵 (x_1,y_1,x_2,y_2)x_1x_2,简单前缀和求出 \displaystyle b_i=\bigoplus_{j=x_1}^{x_2}\bigoplus_{k=1}^ia_{j,k},并且有 b_0=0,则 b_i 对答案的贡献为 \displaystyle\sum_{j=0}^{i-2}[b_i=b_j]

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=155,M=1e3+5;
mt19937_64 rnd(time(0));
ll a[N][M],sum[N][M],b[M];
unordered_map<ll,int>cnt;
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n,m,c;
    cin>>n>>m>>c;
    for(int i=1;i<=c;i++)
    {
        int x,y,val=rnd();
        cin>>x>>y,a[x+1][y+1]^=val;
        cin>>x>>y,a[x+1][y+1]^=val;
    }
    n++,m++;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        sum[i][j]=sum[i-1][j]^a[i][j];
    ll ans=0;
    for(int l=1;l<n;l++)
    for(int r=l+1;r<=n;r++)
    {
        cnt.clear();
        for(int i=1;i<=m;i++)b[i]=b[i-1]^sum[r][i]^sum[l-1][i];
        for(int i=2;i<=m;i++)
        {
            cnt[b[i-2]]++;
            ans+=cnt[b[i]];
        }
    }
    cout<<ans;
    return 0;
}