Codeforces Gym101518F:Dimensional Warp Drive(二分+高斯消元)
题意
给出一个11元组A和11元组B,给出n个11元方程,每个方程有一个日期,要让A变成B,问最少需要日期多少才可以变。
思路
因为日期满足单调性,所以可以二分答案。判断的时候就是高斯消元套模板,这个模板是要能对11取模的(因为说了数字在0到10之间)。
#include <bits/stdc++.h>
using namespace std;
const int MOD = 11;
const int MAXN = 1011;
struct Node {
int num[11];
int tid;
bool operator < (const Node &rhs) const {
return tid < rhs.tid;
}
} init[MAXN];
int a[12][MAXN];//增广矩阵
int x[MAXN];//最后得到的解集
int s[11], e[11];
inline int gcd(int a,int b) {
while(b != 0) {
int t = b;
b = a%b;
a = t;
}
return a;
}
inline int lcm(int a,int b) {
return a/gcd(a,b)*b;
}
long long inv(long long a,long long m) {
if(a == 1)return 1;
return inv(m%a,m)*(m-m/a)%m;
}
int Gauss(int equ, int var) {
int max_r,col,k;
for(k = 0, col = 0; k < equ && col < var; k++,col++) {
max_r = k;
for(int i = k+1; i < equ; i++)
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
if(a[max_r][col] == 0) {
k--;
continue;
}
if(max_r != k)
for(int j = col; j < var+1; j++)
swap(a[k][j],a[max_r][j]);
for(int i = k+1; i < equ; i++) {
if(a[i][col] != 0) {
int LCM = lcm(abs(a[i][col]),abs(a[k][col]));
int ta = LCM/abs(a[i][col]);
int tb = LCM/abs(a[k][col]);
if(a[i][col]*a[k][col] < 0)tb = -tb;
for(int j = col; j < var+1; j++)
a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%MOD + MOD)%MOD;
}
}
}
for(int i = k; i < equ; i++)
if(a[i][col] != 0)
return 0;//无解
return 1;
}
int check(int m) {
int equ = 11, var = m + 1; // 行数和列数
for(int i = 0; i < 11; i++)
for(int j = 0; j <= m; j++)
a[i][j] = init[j].num[i];
for(int i = 0; i < 11; i++)
a[i][var] = (e[i] - s[i] + MOD) % MOD;
return Gauss(equ, var);
}
int main() {
int t; scanf("%d", &t);
while(t--) {
int n; scanf("%d", &n);
for(int i = 0; i < 11; i++) scanf("%d", &s[i]);
for(int i = 0; i < 11; i++) scanf("%d", &e[i]);
for(int i = 0; i < n; i++) {
for(int j = 0; j < 11; j++) scanf("%d", &init[i].num[j]);
scanf("%d", &init[i].tid);
}
sort(init, init + n);
int l = 0, r = n - 1, ans = -1;
while(l <= r) {
int m = (l + r) >> 1;
if(check(m)) {
ans = init[m].tid;
r = m - 1;
} else {
l = m + 1;
}
}
if(~ans) printf("%d\n", ans);
else puts("unreachable");
} return 0;
}
Codeforces Gym101518F:Dimensional Warp Drive(二分+高斯消元)的更多相关文章
- CodeForces 24D Broken robot(期望+高斯消元)
CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...
- Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...
- Codeforces.24D.Broken robot(期望DP 高斯消元)
题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...
- Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)
题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...
- BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元
大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...
- Codeforces Gym10008E Harmonious Matrices(高斯消元)
[题目链接] http://codeforces.com/gym/100008/ [题目大意] 给出 一个n*m的矩阵,要求用0和1填满,使得每个位置和周围四格相加为偶数,要求1的数目尽量多. [题解 ...
- Codeforces 832E Vasya and Shifts - 高斯消元
题目传送门 快速的传送门I 快速的传送门II 题目大意 (题意比较复杂,请自行阅读原题) 可以将原题的字母都看成它们的在字符表中的下标,这样问题就变成给定$n$个$m$维向量$\vec{a_{1}}, ...
- Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元
E. Wizards and Bets 题目连接: http://www.codeforces.com/contest/167/problem/E Description In some countr ...
- Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元
https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...
随机推荐
- WPF Timeline简易时间轴控件的实现
原文:WPF Timeline简易时间轴控件的实现 效果图: 由于整个控件是实现之后才写的教程,因此这里记录的代码是最终实现后的,前后会引用到其他的一些依赖属性或者代码,需要阅读整篇文章. 1.确定T ...
- 批量删除C和C++注释
使用Python语言 ,实现批量删除C/C++类型注释1.目前支持去掉.h .hpp .c .cpp .java 这些以//或/**/为注释符的源文件 2.支持递归遍历目录 3.当前版本为Python ...
- Logback 专题
logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <configuratio ...
- 读BeautifulSoup官方文档之html树的搜索(2)
除了find()和find_all(), 这里还提供了许多类似的方法我就细讲了, 参数和用法都差不多, 最后四个是next, previous是以.next/previous_element()来说的 ...
- 关于WPF XAML 中 Trigger的反向ExitActions
触发器,顾名思义,就是当满足一定条件时,会触发一些操作,比如:改变控件的透明度,显隐,宽高等等,触发器本身做了一些操作,就是触发器触发条件不符合的时候,会自动把在触发器中更改的属性还原.但,并不是所有 ...
- WPF属性(二)附加属性
原文:WPF属性(二)附加属性 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解 ...
- 【Ubuntu】查看进程端口占用信息
1.查看进程信息 ①进程查看 ps -aux ②根据PID查看进程 ps -aux | grep pid ③进程计数,查看指定进程 ps -aux | wc -l ps -aux | grep kwo ...
- Win10如何关闭自动更新服务
原文:Win10如何关闭自动更新服务 第一步: 小娜搜索"gpedit.msc",进入本地计算机策略设置. 第二步: 找到策略位置:本地计算机策略-计算机配置-管理模板-Windo ...
- html send mail
<html> <body> <script> var formattedBody = "FirstLine \n Second Line \n Third ...
- 微信小程序把玩(二十八)image组件
原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...