首页 > 其他分享 >CF1977D XORificator

CF1977D XORificator

时间:2024-11-09 21:35:10浏览次数:1  
标签:方案 CF1977D 反转 矩阵 哈希 XORificator

CF1977D XORificator

题意

给你一个二进制(仅由 \(0\) 和 \(1\) 组成)\(n \times m\) 矩阵。你可以进行以下操作任意次:反转某一行中的所有值(即用 \(1\) 替换 \(0\),用 \(0\) 替换 \(1\))。

矩阵中的某一列如果只包含一个 \(1\),则被视为特殊列。你的任务是找出最多有多少列可以同时被特殊化,以及为达到这一目的应在哪几行反转。

\(1\le nm\le 3\times 10^5\)

题解

我们发现,如果我们钦定第 \(j\) 列的第 \(i\) 行位置为 \(1\),其他行位置为 \(0\)。会发现其实我们确定了整个矩阵。它的反转方式也是唯一确定的。

于是可以考虑枚举每一列,得到钦定某一个位置为 \(1\) 时哪些行需要反转。

在最多列出现的反转方案就是答案。于是我们可以将一种反转方案哈希起来,放入 map 进行统计,这里我用的随机权值异或的哈希方法。

接着考虑如何 \(\mathcal O(1)\) 求出反转方案的哈希值。

可以统计前后缀的哈希值,为 \(1\) 视作反转,为 \(0\) 视作不反转,一个位置为 \(1\) 的反转方案应该为前后缀的反转方案加上这一位的相反状态。

于是我们就可以 \(\mathcal O(nm)\) 的解决掉这道题。

总结

  • 找供需关系

    看答案的贡献并找到使得这个贡献进入答案的要求

标签:方案,CF1977D,反转,矩阵,哈希,XORificator
From: https://www.cnblogs.com/lupengheyyds/p/18537297

相关文章

  • D. XORificator
    D.XORificatorYouaregivenabinary(consistingonlyof0sand1s)$n\timesm$matrix.YouarealsogivenaXORificator,usingwhichyoucaninvertallthevaluesinachosenrow(i.e.replace0with1and1with0).Acolumninthematrixisconsider......
  • CF 948 DIV.2 D. XORificator
    考虑对每个设置为1且唯一那么我们发现对于所有的状态都是确定且唯一的那么我们对于每个点假设它为1且为该列唯一对于除它之外的点的状态进行存储又由于这个值过于大我们考虑使用哈希存储那么出现次数最多的值即为答案点击查看代码map<ull,int>cnt;map<ull,pii>pos;void......
  • D. XORificator
    原题链接题解一句话总结:使得\((i,j)\)内的元素为1,且为所在列的唯一一个1,需要翻转哪些行?在我看来,用了随机概率异或哈希code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;mt19937_64rnd(chrono::steady_clock::now().time_since_epoch().count());......