coderfoces D. Gourmet choice
D. Gourmet choice
2 seconds
256 megabytes
Discribe
Mr. Apple, a gourmet, works as editor-in-chief of a gastronomic periodical. He travels around the world, tasting new delights of famous chefs from the most fashionable restaurants. Mr. Apple has his own signature method of review — in each restaurant Mr. Apple orders two sets of dishes on two different days. All the dishes are different, because Mr. Apple doesn't like to eat the same food. For each pair of dishes from different days he remembers exactly which was better, or that they were of the same quality. After this the gourmet evaluates each dish with a positive integer.
Once, during a revision of a restaurant of Celtic medieval cuisine named «Poisson», that serves chestnut soup with fir, warm soda bread, spicy lemon pie and other folk food, Mr. Apple was very pleasantly surprised the gourmet with its variety of menu, and hence ordered too much. Now he's confused about evaluating dishes.
The gourmet tasted a set of n
dishes on the first day and a set of m dishes on the second day. He made a table a of size n×m, in which he described his impressions. If, according to the expert, dish i from the first set was better than dish j from the second set, then aij is equal to ">", in the opposite case aij is equal to "<". Dishes also may be equally good, in this case aij
is "=".
Now Mr. Apple wants you to help him to evaluate every dish. Since Mr. Apple is very strict, he will evaluate the dishes so that the maximal number used is as small as possible. But Mr. Apple also is very fair, so he never evaluates the dishes so that it goes against his feelings. In other words, if aij
is "<", then the number assigned to dish i from the first set should be less than the number of dish j from the second set, if aij is ">", then it should be greater, and finally if aij
is "=", then the numbers should be the same.
Help Mr. Apple to evaluate each dish from both sets so that it is consistent with his feelings, or determine that this is impossible.
The first line contains integers n
and m (1≤n,m≤1000
) — the number of dishes in both days.
Each of the next n
lines contains a string of m symbols. The j-th symbol on i-th line is aij
. All strings consist only of "<", ">" and "=".
The first line of output should contain "Yes", if it's possible to do a correct evaluation for all the dishes, or "No" otherwise.
If case an answer exist, on the second line print n
integers — evaluations of dishes from the first set, and on the third line print m
integers — evaluations of dishes from the second set.
3 4
>>>>
>>>>
>>>>
Yes
2 2 2
1 1 1 1
3 3
>>>
<<<
>>>
Yes
3 1 3
2 2 2
3 2
==
=<
==
No
In the first sample, all dishes of the first day are better than dishes of the second day. So, the highest score will be 2
, for all dishes of the first day.
In the third sample, the table is contradictory — there is no possible evaluation of the dishes that satisfies it.
题意
有两个点集分别有n个点和m个点,告诉你第一个集合里的所有点的权值和第二个集合里的所有点的权值的大小关系。
问是否能给每个点赋一个值,使得满足题目所给的大小关系,如果可以,输出任意一组合法解。
题解:
对于任意两个点ai和bj,如果ai<bj则,连一条从j到i的单向边,问题即为每个点的最长路。
如果相等,我们缩点即可。如果有环则说明无解。
具体步骤:
先缩点,再判环,我直接tarjan求环,然后再在DAG上dfs求最长路即可。
Debug:
1.一开始先不管相等的边,判环再缩点,导致可能缩点之后又有新的环产生。
2.一看n<1000,平时做多了n和边是一个数量级的题目,于是边只开了10000,还以为够了,真是惯性思维惹的祸,还是太菜了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 2000050
char road[][];
int n,m,fa[N],f[N],ans[N];
bool flag=;
struct Edge{int from,to,s;}edges[N<<],edges2[N<<];
int tot,last[N];
template<typename T>void read(T&x)
{
int k=;char c=getchar();
x=;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if(c==EOF)exit();
while(isdigit(c))x=x*+c-'',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while((c=getchar())!='<'&&c!='>'&&c!='='&&c!=EOF);}
int gf(int x)
{
if (x==fa[x])return x;
fa[x]=gf(fa[x]);
return fa[x];
}
void AddEdge(int x,int y)
{
edges[++tot]=Edge{x,y,last[x]};
last[x]=tot;
}
int low[N],dfn[N],sk[N],at_sk[N],top,Time;
void tarjan(int x)
{
dfn[x]=++Time;
low[x]=Time;
sk[++top]=x;
at_sk[x]=;
f[x]=;
for(int i=last[x];i;i=edges[i].s)
{
Edge &e=edges[i];
if (gf(x)==gf(e.to))flag=true;
if (!f[e.to])tarjan(e.to);
if (at_sk[e.to])low[x]=min(low[x],low[e.to]);
}
if (sk[top]!=x)flag=true;
if (low[x]==dfn[x])
{
while(sk[top+]!=x&&top)
at_sk[sk[top--]]=;
}
}
void dfs(int x)
{
f[x]=;
ans[x]=;
for(int i=last[x];i;i=edges[i].s)
{
Edge &e=edges[i];
if(!ans[e.to]&&!f[e.to])dfs(e.to);
ans[x]=max(ans[x],ans[e.to]);
}
ans[x]++;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
read(n);read(m);
char c;
for(int i=;i<=n+m+n;i++)fa[i]=i;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
read_char(c);
//if (c=='<')AddEdge(j+n,i);
//if (c=='>')AddEdge(i,j+n);
road[i][j]=c;
if (c=='=')fa[gf(i)]=gf(j+n);
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if (road[i][j]=='<')AddEdge(gf(j+n),gf(i));
else if (road[i][j]=='>')AddEdge(gf(i),gf(j+n)); for(int i=;i<=n+m;i++) if(!f[gf(i)]&&!flag)tarjan(gf(i));
if (flag)
{
printf("No");
return ;
}
printf("Yes\n");
memset(f,,sizeof(f));
for(int i=;i<=n+m;i++) if (!f[gf(i)]) dfs(gf(i));
for(int i=;i<=n;i++) printf("%d ",ans[gf(i)]);
putchar('\n');
for(int i=;i<=m;i++) printf("%d ",ans[gf(i+n)]);
}
coderfoces D. Gourmet choice的更多相关文章
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- D. Gourmet choice并查集,拓扑结构
D. Gourmet choice time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- codeforces #541 D. Gourmet choice(拓扑+并查集)
Mr. Apple, a gourmet, works as editor-in-chief of a gastronomic periodical. He travels around the wo ...
- CF1131D Gourmet choice
题目链接 题意 有两组菜,第一组有\(n\)种,第二组有\(m\)种.给出一个\(n\times m\)的矩阵,第\(i\)行第\(j\)列表示第一组中的第\(i\)种菜与第二组中的第\(j\)种菜好 ...
- CF1131D Gourmet choice(并查集,拓扑排序)
这题CF给的难度是2000,但我感觉没这么高啊…… 题目链接:CF原网 题目大意:有两个正整数序列 $a,b$,长度分别为 $n,m$.给出所有 $a_i$ 和 $b_j(1\le i\le n,1\ ...
- 【CF #541 D】 Gourmet choice
link:https://codeforces.com/contest/1131 题意: 给定一些大小比较,输出排名. 思路: 这道题我用的是拓扑排序,又因为有等于号的存在,我用了并查集. 结束后这道 ...
- CF - 1131 D Gourmet choice
题目传送门 先把 = 的人用并查集合并在一起. 然后 < > 的建边, 跑一遍 toposort 之后就好了. 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的 ...
- CF#541 D. Gourmet choice /// BFS 拓扑
题目大意: 给定n m 第一行有n个数 第二行有m个数 接下来n行每行m列 有 = < > 位于 i j 的符号表示 第一行第i个数与第二行第j个数的大小关系 1.将n+m个数 当做按顺序 ...
- Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)
D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: = 的情况我们用并查集把他们扔到一个集合,然后根据 > ...
随机推荐
- 关于setTimeout()你所不知道的地方
前言:看了这篇文章,1.注意setTimeout引用的是全部变量还是局部变量了,当直接调用外部函数方法时,实际上函数内部的变量已经变成全 局.2.提醒我防止出错的,用匿名函数不容易出错.3.setTi ...
- Linux实战教学笔记33:lvs+keepalived集群架构服务
一,LVS功能详解 1.1 LVS(Linux Virtual Server)介绍 LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服 ...
- linux下jdk/maven/tomcat
debian安装的openjdk只包括jre,没有tools.jar,dt.jar,所以要安装openjdk完全版. sudo apt--jdk 若操作系统中安装多个版本的java,可以采用如下命令来 ...
- Scala基础:模式匹配和样例类
模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...
- Linux版本信息如何查询
1.输入"uname -a ",可显示电脑以及操作系统的相关信息.2.输入"cat /proc/version",说明正在运行的内核版本.3.输入"c ...
- 274. H-Index论文引用量
[抄题]: Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...
- [erlang 002]gen_server中何时会跑到terminate函数
一.从start方法产出的独立gen_server进程 实验代码: %%%-------------------------------------- %%% @Module : %%% @Auth ...
- C#HTML解析利器HtmlAgilityPack
HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手.目前 ...
- Android有趣的全透明效果--Activity及Dialog的全透明(附android系统自带图标大全)[转]
原文地址:http://blog.csdn.net/sodino/article/details/5822147 1.Activity全透明 同学zzm给了这个有趣的代码,现在公布出来. 先在res/ ...
- python用sqlite3模块操作sqlite数据库-乾颐堂
SQLite是一个包含在C库中的轻量级数据库.它并不需要独立的维护进程,并且允许使用非标准变体(nonstandard variant)的SQL查询语句来访问数据库. 一些应用可是使用SQLite保存 ...