THE MATRIX PROBLEM
THE MATRIX PROBLEM |
| Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
| Total Submission(s): 41 Accepted Submission(s): 14 |
|
Problem Description
You have been given a matrix CN*M, each element E of CN*M is positive and no more than 1000, The problem is that if there exist N numbers a1, a2, … an and M numbers b1, b2, …, bm, which satisfies that each elements in row-i multiplied with ai and each elements in column-j divided by bj, after this operation every element in this matrix is between L and U, L indicates the lowerbound and U indicates the upperbound of these elements.
|
|
Input
There are several test cases. You should process to the end of file.
Each case includes two parts, in part 1, there are four integers in one line, N,M,L,U, indicating the matrix has N rows and M columns, L is the lowerbound and U is the upperbound (1<=N、M<=400,1<=L<=U<=10000). In part 2, there are N lines, each line includes M integers, and they are the elements of the matrix. |
|
Output
If there is a solution print "YES", else print "NO".
|
|
Sample Input
3 3 1 6 |
|
Sample Output
YES |
|
Source
2010 Asia Regional Harbin
|
|
Recommend
lcy
|
/*
题意:给你一个n*m的矩阵,现在问你,存不存在这样的两个序列,a1,a2...an, b1,b2....bm,使得矩阵每行的元素都乘a序列每
列的都除以b序列,这个操作之后,矩阵的每个元素都在[L,U]这个区间内。 初步思路:对每个元素与L,U联立不等式,然后按照不等式建边,再用spfa跑一下 #补充:虽然初步思路想的很好但是,还是想不出来怎么才能以i,j为参考进行建边,看了一下题解,L<=num[i][j]*a[i]/b[j]<=U
可以化简为,L/num[i]<=a[i]/b[i]<=U/num,但是现在中间的除法还是不好处理,经过log之后除法变成减法,就会处理了很多
log(L/num[i][j])<=log(a[i])-log(b[j])<=log(U/num[i][j]);
*/
#include<bits/stdc++.h>
using namespace std;
/*****************************************************spaf模板*****************************************************/
const int maxn = + ;
const int INF = 1e9 + ; typedef struct node{
int to;
int next;
double w;
node(int a = , int b = , double c = ){
to = a; next = b; w = c;
}
}Edge; int s[maxn * ];
double dis[maxn * ];
Edge edge[maxn * maxn * ];
int tot, head[maxn * maxn * ];
int vis[maxn * ], cnt[maxn * ]; void add(int u, int v, double w){
edge[tot] = node(v, head[u], w);
head[u] = tot++;
}
bool spfa(int e){
int u, v, top = ;
for(int i = ; i <= e; ++i){
dis[i] = INF;
vis[i] = ; cnt[i] = ;
}
s[top++] = ; vis[] = ; dis[] = ;
while(top){
u = s[--top]; vis[u] = ;
if((++cnt[u]) > e) return ;
for(int i = head[u]; ~i; i = edge[i].next){
v = edge[i].to;
if(dis[v] > dis[u] + edge[i].w){
dis[v] = dis[u] + edge[i].w;
if(!vis[v]){
s[top++] = v;
vis[v] = ;
}
}
}
}
return ;
}
/*****************************************************spaf模板*****************************************************/
void init(){
memset(head,-,sizeof head);
tot=;
}
int n,m,L,U;
int num;
int main(){
// freopen("in.txt","r",stdin);
while(~scanf("%d%d%d%d",&n,&m,&L,&U)){
init();
for(int i=;i<n;i++){
for(int j=;j<m;j++){
scanf("%d",&num);
//log(L/num[i][j])<=log(a[i])-log(b[j])
//i-j>=log(L/num[i][j])
add(i, j + n, log(1.0 * U / num));
//log(U/num[i][j])>=log(a[i])-log(b[j])
//i-j<=log(U/num[i][j]) add(j + n, i, -log(1.0 * L / num));
}
}
printf(spfa(n+m-)?"YES\n":"NO\n");
}
return ;
}
THE MATRIX PROBLEM的更多相关文章
- HDU 3666.THE MATRIX PROBLEM 差分约束系统
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- 差分约束系统+(矩阵)思维(H - THE MATRIX PROBLEM HDU - 3666 )
题目链接:https://cn.vjudge.net/contest/276233#problem/H 题目大意:对于给定的矩阵 每一行除以ai 每一列除以bi 之后 数组的所有元素都还在那个L- ...
- HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)
题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...
- HDU 3666 THE MATRIX PROBLEM (差分约束)
题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...
- hduTHE MATRIX PROBLEM(差分约束)
题目请戳这里 题目大意:给一个n*m的矩阵,求是否存在这样两个序列:a1,a2...an,b1,b2,...,bm,使得矩阵的第i行乘以ai,第j列除以bj后,矩阵的每一个数都在L和U之间. 题目分析 ...
随机推荐
- 深入浅出AQS之独占锁模式
每一个Java工程师应该都或多或少了解过AQS,我自己也是前前后后,反反复复研究了很久,看了忘,忘了再看,每次都有不一样的体会.这次趁着写博客,打算重新拿出来系统的研究下它的源码,总结成文章,便于以后 ...
- MXNet--DMLC-Core代码解读与宏
MXNet--DMLC-Core代码解读与宏 dmlc-core是Distributed (Deep) Machine Learning Community的一个基础模块,这个模块用被应用到了mxne ...
- 再起航,我的学习笔记之JavaScript设计模式28(委托模式)
## 委托模式 ### 概念介绍 **委托模式(Entrust): **多个对象接收并处理同一请求,他们将请求委托给另一个对象统一处理请求. ### 利用委托优化循环 如果我们有一个需求需要让用户点击 ...
- 嵌入式linux开发之工具------tftp
我在嵌入式linux开发中用到tftp的地方主要有2个方面: 1.是在嵌入式目标板启动时,bootloader启动时通过uEnv文件,下载dtb文件和kernel文件: 2.是在嵌入式目标板启动后,通 ...
- vue前端页面跳转参数传递及存储
不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示. 路由传递参数 this.$router.push({ name: '跳入页面', params ...
- python2.7 使用super关键词 报错 TypeError: must be type, not&n
错误试验代码: class Base(): def meth(self): print "i'm base" class Derived(Base): def meth(self) ...
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- 基于RTKLIB构建高并发通信测试工具
1. RTKLIB基础动态库生成 RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,由日本东京海洋大学的 ...
- WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方
按说ShowDialog()是模态窗口,应该在主窗口的上方,但是打开其他应用窗口再切换回来的时候,发现子窗口不见了,主窗口又不能操作. 另外子窗口设置成不在任务栏显示,只能通过Alt-Tab来切换到子 ...
- WPF ListBox数据绑定
本文来源 http://wshoufeng1989.blog.163.com/blog/static/202047033201282911633670/ 风随影动的博客 使用数据库AllData , ...