Hiho1422 Harmonic Matrix Counter (高斯消元)
16年北京站A题 真的难啊..
题意:
定义和谐矩阵 就是每个元素和上下左右的xor值=0
输出一个超大数 然后最多800个询问 求字典序第k小的和谐矩阵 x y位置上的数
题解:
首先这个超大数的范围其实给了提示 $2^{800}$ 我们刚好想到枚举第一行 就有这么多种
确实 我们很容易发现 枚举了第一行之后 整个矩阵就可以算出来了
然后现在就要引出一个子题 P3164
关于这个子题 在2020年5月份之前洛谷上的题解都不是太正的做法
正确做法是 把第一行的每个元素当作一个未知数 然后可以推到第n行
用第n行是和谐矩阵元素的关系得到m个方程式 高斯消元解之
我们再回到这个题 我们同样可以用这样的方法 高斯消元解之 然后我们开始写了!
先用高斯消元解出系数 然后把10进制的大数转化为二进制 为什么这题有第k小呢 因为我们解出了自由元啊!
如果自由元所能提供的解 小于k就直接无解了
然后我们惊奇的发现 字典序第k小的二进制刚好就是这个问题自由元的解 一一对应填进去就行了
然后这样交上去会得到 WA!!
为什么呢? 因为我们正常解出的自由元 所对应的未知数 实际上是可以提前更换位置的啊!
那么我们可以把自由元放在最前面 以得到字典序最小

#include <stdio.h>
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
const int MAXN = 805; int n, m, q, x, y, len, rk, blen;
bitset<MAXN> a[MAXN][MAXN];
bitset<MAXN> b[MAXN];
int ans[MAXN];
int fr[MAXN];
char s[MAXN];
int t[MAXN], bit[MAXN << 3]; int dx[] = {-1, -1, -1, -2};
int dy[] = {-1, 0, 1, 0}; bool check(int x, int y) {
if(x >= 1 && x <= n && y >= 1 && y <= m) return true;
return false;
} void gauss() {
rk = 0;
for(int i = 1, now = m; i <= m && now; now--) {
for(int j = i; j <= m; j++) {
if(b[j][now]) {
std::swap(b[j], b[i]);
break;
}
}
if(!b[i][now]) {
//fr[now] = 1;
continue;
}
for(int j = i + 1; j <= m; j++) {
if(b[j][now]) {
b[j] ^= b[i];
}
}
fr[now] = i;
i++; rk++;
}
} void decode() {
blen = 0;
int llen = strlen(s + 1); memset(bit, 0, sizeof(bit));
for(int i = 1; i <= llen; i++) t[i] = s[llen - i + 1] - '0';
t[1]--;
int now = 1; while(t[now] < 0) t[now] += 10, now++, t[now]--;
while(llen && !t[llen]) llen--; while(llen) {
if(t[1] & 1) bit[++blen] = 1;
else bit[++blen] = 0; int res = 0;
for(int i = llen; i >= 1; i--) {
int tmp = (t[i] + res * 10) / 2;
res = (t[i] + res * 10) % 2;
t[i] = tmp;
}
while(llen && !t[llen]) llen--;
}
} void get() {
blen = max(blen, m - rk);
memset(ans, 0, sizeof(ans));
for(int i = 1; i <= m; i++) if(!fr[i]) ans[i] = bit[blen--];
for(int i = 1; i <= m; i++) {
if(fr[i])
for(int j = i - 1; j; j--) {
if(b[fr[i]][j]) ans[i] ^= ans[j];
}
}
} int main() {
while(~scanf("%d%d%d", &n, &m, &q)) {
memset(fr, 0, sizeof(fr));
for(int i = 1; i <= m; i++) b[i].reset();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
a[i][j].reset();
for(int i = 1; i <= m; i++) a[1][i][i] = 1; for(int i = 2; i <= n; i++) {
for(int j = 1; j <= m; j++) {
for(int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if(check(nx, ny)) a[i][j] ^= a[nx][ny];
}
}
}
for(int i = 1; i <= m; i++) b[i] = a[n][i];
for(int i = 1; i <= m; i++) {
if(n - 1 >= 1) b[i] ^= a[n - 1][i];
if(i - 1 >= 1) b[i] ^= a[n][i - 1];
if(i + 1 <= m) b[i] ^= a[n][i + 1];
}
gauss();
//for(int i = 1; i <= m; i++) cout << fr[i] << " "; puts(""); //cout << m - rk << " ??" << endl;
for(int cas = 1; cas <= q; cas++) {
scanf("%s%d%d", s + 1, &x, &y);
decode();
//cout << "blen =" << blen <<endl;
if(m - rk < blen) printf("?");
else {
get();
/*
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
int res = 0;
for(int k = 1; k <= m; k++)
if(a[i][j][k]) res ^= ans[k];
printf("%d ", res);
}
puts("");
}*/ int res = 0;
for(int i = 1; i <= m; i++) if(a[x][y][i]) res ^= ans[i];
printf("%d", res);
}
}
puts("");
}
return 0;
}
/*
3 5 10
0 0 0 2 1
1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
2 1 1
0 0 1 1 1
0 1 0 1 0
1 1 1 0 0
3 1 1
0 1 0 0 0
1 1 1 0 0
0 0 0 1 0
4 1 1
0 1 1 0 1
1 0 0 0 1
1 0 1 1 0
5 1 1
1 0 0 0 0
1 1 0 0 0
1 0 1 0 0
6 1 1
1 0 1 1 0
1 0 0 0 1
0 1 1 0 1
7 1 1
1 1 0 0 0
0 0 1 0 0
1 0 1 1 0
8 1 1
1 1 1 0 0
0 1 0 1 0
0 0 1 1 1
*/
Hiho1422 Harmonic Matrix Counter (高斯消元)的更多相关文章
- 算法竞赛进阶指南0x35高斯消元与线性空间
高斯消元 目录 高斯消元 ACWing207. 球形空间产生器(点击访问) 求解思路 代码 ACWing208. 开关问题(点击访问) 思路 代码 总结 欣赏 线性空间 定义 ACWing209. 装 ...
- Matrix 高斯消元Gaussian elimination 中的complete pivoting和partial pivoting
首先科普下Pivoting的含义 一般翻译为“主元”,在对矩阵做某种算法时,首先进行的部分元素.在线性规划的单纯形法中常见.wiki的解释如下:Pivot element(the first elem ...
- UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- UVALive 6449 IQ Test --高斯消元?
题意:给你一串数字,问这串数字符合f[n] = a*f[n-1],f[n] = a*f[n-1]+b*f[n-2],f[n] = a*f[n-1]+b*f[n-2]+c*f[n-3]这几个方程中的哪个 ...
- USACO 3.2 ratios 高斯消元
题目原意很简单,就是解一个三元一次方程组 直接高斯消元解方程组,枚举最后一列的倍数(k) 注意double的精度,有很多细节需要处理 /* PROB:ratios LANG:C++ */ #inclu ...
- HDU 5833 Zhu and 772002 (高斯消元)
Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...
- 【高斯消元】兼 【期望dp】例题
[总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $ ...
- BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]
3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...
- 高斯消元 & 线性基【学习笔记】
高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...
随机推荐
- Wi-Fi 6 与 5G 相比哪个更快?
随着 iPhone12 的发布,iOS 系统正式开始拥抱 5G,智能手机全面进入了 5G 时代.伴随着各大运营商的 5G 推广以及相关基站建设的如火如荼,5G 成了大家广泛讨论的热门词汇.这样热门的光 ...
- laravel邮件发送
laravel邮件发送 使用邮件发送类Mail 文本 静态方法 raw() 富文本 静态方法 send() 注:使用邮件发送必须有邮件账号,需要开启smtp协议,现在主流服务器都支持,smtp默认端口 ...
- 【JavaWeb】Cookie&Session
Cookie&Session Cookie 什么是 Cookie Cookie 即饼干的意思 Cookie 是服务器通知客户端保存键值对的一种技术 客户端有了 Cookie 后,每次请求都发送 ...
- python常见题型
语言特性 1. 谈谈对 Python 和其他语言的区别 2. 简述解释型和编译型编程语言 3. Python 的解释器种类以及相关特点? 4. Python3 和 Python2 的区别? 5. Py ...
- Python绘制雷达图(俗称六芒星)
原文链接:https://blog.csdn.net/Just_youHG/article/details/83904618 背景 <Python数据分析与挖掘实战> 案例2–航空公司客户 ...
- 【Spring】Spring的数据库开发 - 2、Spring JdbcTemplate的常用方法(execute、update、query)
Spring JdbcTemplate的常用方法 文章目录 Spring JdbcTemplate的常用方法 execute() update() query() 简单记录-Java EE企业级应用开 ...
- Tippy.js - 免费开源且高度可定制的气泡提示独立组件
推荐一个非常优秀的 web 气泡提示独立UI组件. 介绍 Tippy.js 是一款用于Web的完整工具提示,弹出菜单,下拉菜单和菜单解决方案.适用于鼠标,键盘和触摸输入. 特点 超轻量的纯 javas ...
- kubernets之服务资源
一 服务集群内部或者客户端与pod的通信桥梁 kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式? pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下 ...
- 干电池1.5V升压3.3V芯片电路图
1.5V升压3.3V的芯片 PW5100 是一款大效率.10uA低功耗.低纹波.高工作频率1.2MHZ的 PFM 同步升压 DC/DC 变换器.输入电压可低0.7V,输入电压范围0.7V-5V之间,输 ...
- 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序
对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...