CF 251D Two Sets 异或高斯消元找最优解
来源:互联网 发布:宽带连接多重网络 编辑:程序博客网 时间:2024/04/29 23:38
题目大意
给你
解体思路
一看到这种异或题就会想到对每个数一位一位的处理,由于是要把一堆数分成两堆,我们就考虑一下分开后的情况。由于异或就是在模2意义下的无进位加法,我们就只考虑1。如果对于某一位,一开始是由奇数个一异或,那么分开两组后必定是有一组有奇数个1,一组有偶数个1,那么不管怎么分组对答案都不会有影响,但我们也要尽量把奇数个一分到第一组使第一堆的异或和尽量小。而如果总共有偶数个1就不同了,由于当且仅当分开的组中的某一位有奇数个1时才会对答案造成影响,所以我们要尽可能的把偶数个1分成有奇数个1的两组。由此我们可以对每一个偶数为列出一个异或方程,形如
那应该怎么实现呢?
我们可以先做含偶数个1的位,然后从高位往低位枚举,以保证答案的最优性。每做一位,我们就新添加以个方程,为了满足高斯消元的要求,我们先把之前方程要消的项消掉。如果我们发现消完后这个方程的所有系数都为0,即所有
程序
附上简洁的代码!
//CF251D Two Sets YxuanwKeith#include <cstring>#include <cstdio>#include <algorithm>#include <bitset>using namespace std;typedef long long LL;const int MAXN = 1e5 + 5, MAXM = 62;bitset<MAXN> Map[MAXM + 1], F[MAXM + 1]; int tot, N, Ok[MAXM + 1], Ans[MAXN];LL All;int main() { freopen("4021.in", "r", stdin), freopen("4021.out", "w", stdout); scanf("%d", &N); for (int i = 1; i <= N; i ++) { LL Num; scanf("%lld", &Num); All ^= Num; for (int j = 0; j <= MAXM; j ++) if (Num & (1ll << j)) Map[j][i] = 1; } for (int j = 0; j < 2; j ++) { for (int i = MAXM; i >= 0; i --) if (((All >> i) & 1) == j) { F[++ tot] = Map[i], Ok[tot] = N + 2, F[tot][N + 1] = 1 - j; for (int k = 1; k < tot; k ++) if (F[tot][Ok[k]]) F[tot] ^= F[k]; for (int k = 1; k <= N; k ++) if (F[tot][k]) { Ok[tot] = k; break;} if (Ok[tot] > N) {tot --; continue;} for (int k = 1; k < tot; k ++) if (F[k][Ok[tot]]) F[k] ^= F[tot]; } } for (int i = 1; i <= tot; i ++) Ans[Ok[i]] = F[i][N + 1]; for (int i = 1; i <= N; i ++) printf("%d ", 2 - Ans[i]);}
- CF 251D Two Sets 异或高斯消元找最优解
- CF 251D Two Sets
- CF 251D Two Sets(位操作,解方程)
- Codeforces 251D Two Sets
- Codeforces 469D Two Sets 题解
- Codeforces 469D Two Sets 题解
- cf Two Sets (我用二分最大匹配做的)
- cf 468B Two Sets | dfs、二分搜索
- CF-13D - Two Paths(搜索)
- CF 8D Two Friends (三分+二分)
- CF 8D Two Friends 【二分+三分】
- CF 14 problem D - Two paths
- 【CF 125D】 Two progressions 划分等差数列
- Codeforces Round #268 (Div. 2) D Two Sets
- Codeforces Round #268 (Div. 2) D. Two Sets
- Codeforces 469D Two Sets【思维+并查集】
- Least-Squares Fitting of Two 3-D Point Sets
- cf 167.div2 D.Dima and Two Sequences
- Log类简单的使用
- 4、MongoDB集合里面文档的插入,查找,更新操作
- POJ1502 MPI Maelstrom(最短路径)
- 第三方微信授权登录的iOS代码分析
- 局域网跨机访问WCF服务出错本机访问正常的问题
- CF 251D Two Sets 异或高斯消元找最优解
- poj 3050 hopscotch
- An internal error occurred during: "Initializing Java Tooling". java.lang.NullPointerException
- 例解 autoconf 和 automake 生成 Makefile 文件
- AFNetworking3同步请求另类解决方案(阻塞线程)
- corethink功能模块探索开发(十四)后台编辑按钮
- 【学习笔记】3D图形核心基础精炼版-7:stage3D实战-范例工程1
- 使用hexo在github上搭建博客
- [2] CSS&javascript(基本语法及使用)