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之间. 题目分析 ...
随机推荐
- js特效遮罩层(弹出层)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 【Java】关于Java8 parallelStream并发安全的思考
背景 Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream. 在爬虫开发 ...
- [js高手之路] html5 canvas系列教程 - 线形渐变,径向渐变与阴影设置
接着上文[js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)继续. 一.线形渐变 线形渐变指的是一条直线上发生的渐变. 用法: var linear ...
- 一次生产环境下MongoDB备份还原数据
最近开发一个版本的功能当中用到了MongoDB分页,懒于造数据,于是就研究了下从生产环境上导出数据到本地来进行测试. 研究了一下,发现MongoDB的备份还原和MySQL语法还挺类似,下面请看详细介绍 ...
- 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次 ...
- Elixir游戏服设计六
接上章,我新建了个app做包含Table模型, TableServer等.Table桌子的代码暂时如下, 有一些状态还没用上 defmodule Table do @state_accept 0 #准 ...
- JAVA提高一:静态导入、可变参数、增强型for循环、装拆箱
国庆假期已结束,假期8天,全部在家带娃,体会到了妻子的不容易,需要好好努力来多赚钱了,言归正传.10月份开始进去JAVA 高级语法知识学习,本节复习学习的为:静态导入.可变参数.增强型for循环.装拆 ...
- zoj3321 circle floyd 最小生成树
Circle 断一个图是否是一个环. 思路:必有m==n,那么我们用n-1条边能够生成一棵树(即是所有点联通,则用floyd即可),然后看最后一条边的两个点是否是单边(度为一)即可 . #includ ...
- Java高新技术 Myeclipse 介绍
Java高新技术 Myeclipse 介绍 知识概述: (1)Myeclipse开发工具介绍 (2)Myeclipse常用开发步骤详解 ...
- 【MVC】会员注册/登录,普通验证,会员名是否注册Ajax验证以及会员邮件验证实现原理
using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentM ...