E. National Property
time limit per test

1 second

memory limit per test

512 megabytes

input

standard input

output

standard output

You all know that the Library of Bookland is the largest library in the world. There are dozens of thousands of books in the library.

Some long and uninteresting story was removed...

The alphabet of Bookland is so large that its letters are denoted by positive integers. Each letter can be small or large, the large version of a letter x is denoted by x'. BSCII encoding, which is used everywhere in Bookland, is made in that way so that large letters are presented in the order of the numbers they are denoted by, and small letters are presented in the order of the numbers they are denoted by, but all large letters are before all small letters. For example, the following conditions hold: 2 < 3, 2' < 3', 3' < 2.

A word x1, x2, ..., xa is not lexicographically greater than y1, y2, ..., yb if one of the two following conditions holds:

  • a ≤ b and x1 = y1, ..., xa = ya, i.e. the first word is the prefix of the second word;
  • there is a position 1 ≤ j ≤ min(a, b), such that x1 = y1, ..., xj - 1 = yj - 1 and xj < yj, i.e. at the first position where the words differ the first word has a smaller letter than the second word has.

For example, the word "3' 7 5" is before the word "2 4' 6" in lexicographical order. It is said that sequence of words is in lexicographical order if each word is not lexicographically greater than the next word in the sequence.

Denis has a sequence of words consisting of small letters only. He wants to change some letters to large (let's call this process a capitalization) in such a way that the sequence of words is in lexicographical order. However, he soon realized that for some reason he can't change a single letter in a single word. He only can choose a letter and change all of its occurrences in all words to large letters. He can perform this operation any number of times with arbitrary letters of Bookland's alphabet.

Help Denis to choose which letters he needs to capitalize (make large) in order to make the sequence of words lexicographically ordered, or determine that it is impossible.

Note that some words can be equal.

Input

The first line contains two integers n and m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) — the number of words and the number of letters in Bookland's alphabet, respectively. The letters of Bookland's alphabet are denoted by integers from 1 to m.

Each of the next n lines contains a description of one word in format li, si, 1, si, 2, ..., si, li (1 ≤ li ≤ 100 000, 1 ≤ si, j ≤ m), where li is the length of the word, and si, j is the sequence of letters in the word. The words are given in the order Denis has them in the sequence.

It is guaranteed that the total length of all words is not greater than 100 000.

Output

In the first line print "Yes" (without quotes), if it is possible to capitalize some set of letters in such a way that the sequence of words becomes lexicographically ordered. Otherwise, print "No" (without quotes).

If the required is possible, in the second line print k — the number of letters Denis has to capitalize (make large), and in the third line print kdistinct integers — these letters. Note that you don't need to minimize the value k.

You can print the letters in any order. If there are multiple answers, print any of them.

Examples
input
4 3
1 2
1 1
3 1 3 2
2 1 1
output
Yes
2
2 3
input
6 5
2 1 2
2 1 2
3 1 2 3
2 1 5
2 4 4
2 4 4
output
Yes
0
input
4 3
4 3 2 2 1
3 1 1 3
3 2 3 3
2 3 1
output
No
Note

In the first example after Denis makes letters 2 and 3 large, the sequence looks like the following:

  • 2'
  • 1
  • 1 3' 2'
  • 1 1

The condition 2' < 1 holds, so the first word is not lexicographically larger than the second word. The second word is the prefix of the third word, so the are in lexicographical order. As the first letters of the third and the fourth words are the same, and 3' < 1, then the third word is not lexicographically larger than the fourth word.

In the second example the words are in lexicographical order from the beginning, so Denis can do nothing.

【题意】对于一个数字如3,那么3'<3,且加了'的数均小于没有加'的数,对于两个加了'的数,按照没有'时的规则比较大小,问存不存在一种修改方案将给定的一系列打次化为字典序递增的。

【分析】2-sat,详细见代码。建图请看这里

以下为要求输出字典序最小的模板。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define mp make_pair
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 2e5+;;
const int M = ;
const int mod = ;
const int mo=;
const double pi= acos(-1.0);
typedef pair<int,int>pii;
typedef pair<ll,int>P;
vector<int>vec[N],ans;
struct Edge {
int to,next;
} edge[M];
int head[M],tot;
void init() {
tot = ;
memset(head,-,sizeof(head));
}
void addedge(int u,int v) {
//printf("!!!%d %d\n",u,v);
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
bool vis[N];//染色标记,为true表示选择
int S[N],top;//栈
bool dfs(int u) {
if(vis[u^])return false;
if(vis[u])return true;
vis[u] = true;
S[top++] = u;
for(int i = head[u]; i != -; i = edge[i].next)
if(!dfs(edge[i].to))
return false;
return true;
}
bool Twosat(int n) {
memset(vis,false,sizeof(vis));
for(int i = ; i < n; i += ) {
if(vis[i] || vis[i^])continue;
top = ;
if(!dfs(i)) {
while(top)vis[S[--top]] = false;
if(!dfs(i^)) return false;
}
}
return true;
}
int main() {
int n,m;
int u,v;
scanf("%d%d",&n,&m);
init();
for(int i=,s,x;i<=n;i++){
scanf("%d",&s);
while(s--){
scanf("%d",&x);
vec[i].pb(x);
}
if(i==)continue;
int len=min(vec[i].size(),vec[i-].size());
int pos=-;
for(int j=;j<len;j++){
if(vec[i][j]!=vec[i-][j]){
pos=j;break;
}
}
if(pos==-){
if(vec[i-].size()>vec[i].size()){
return puts("No")*;
}
}
else {
int a=vec[i-][pos],b=vec[i][pos];
if(a>b){
addedge(*a-,*a-);
addedge(*b-,*b-);
}
else {
addedge(*a-,*b-);
addedge(*b-,*a-);
}
}
}
if(Twosat(*m)) {
puts("Yes");
for(int i = ; i < *m; i+=)
if(vis[i])
ans.pb((i)/+);
printf("%d\n",ans.size());
for(int x : ans)printf("%d ",x);
} else printf("No\n");
return ;
}

输出任意一组解。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int maxn=;
const int maxm=; struct qlt
{
int n,num1;
int b[maxn],next[maxm],a[maxm];
int dfn[maxn],low[maxn];
int stack[maxn],belong[maxn];
bool instack[maxn];
int num[maxn],topo[maxn];
int sum2;
int scc,top,index;
vector<int> v[maxn];
void init(int nn)
{
n=nn;num1=;
memset(b,,sizeof(b));
}
void addedge(int x,int y)
{
++num1;a[num1]=y;next[num1]=b[x];b[x]=num1;
}
void tarjan(int x)
{
int y;
low[x]=dfn[x]=++index;
stack[top++]=x;
instack[x]=true;
for (int i=b[x];i>;i=next[i])
{
y=a[i];
if (!dfn[y])
{
tarjan(y);
if (low[x]>low[y]) low[x]=low[y];
}
else if (instack[y]&&low[x]>dfn[y])
low[x]=dfn[y];
}
if (low[x]==dfn[x])
{
scc++;
do
{
y=stack[--top];
instack[y]=false;
belong[y]=scc;
v[scc].push_back(y);
sum2++;
topo[y]=sum2;
num[scc]++;
}
while (y!=x);
}
}
void solve()
{
memset(dfn,,sizeof(dfn));
memset(instack,false,sizeof(instack));
memset(num,,sizeof(num));
index=scc=top=sum2=;
for (int i=;i<n;++i)
if (!dfn[i]) tarjan(i);
}
}mp; int n,m,nn,x;
vector<int> v[maxn],vv; int main()
{
scanf("%d%d",&n,&m);
mp.init(*m);
for (int i=;i<=n;++i)
{
scanf("%d",&nn);
while (nn--)
{
scanf("%d",&x);
v[i].push_back(x);
}
if (i==) continue;
int len=min(v[i-].size(),v[i].size());
int pos=-;
for (int j=;j<len;++j)
{
if (v[i][j]!=v[i-][j])
{
pos=j;
break;
}
}
if (pos==-)
{
if (v[i].size()<v[i-].size())
{
printf("No\n");
return ;
}
}
else
{
int a=v[i-][pos],b=v[i][pos];
//if (a==b) continue;
a--;b--;
if (a>b)
{
mp.addedge(*a+,*a);
mp.addedge(*b,*b+);
}
else
{
mp.addedge(*a+,*b+);
mp.addedge(*b,*a);
}
}
}
mp.solve();
for (int i=;i<m;++i)
{
if (mp.belong[*i]==mp.belong[*i+])
{
printf("No\n");
return ;
}
}
vv.clear();
for (int i=;i<m;++i) if (mp.topo[*i]<mp.topo[*i+]) vv.push_back(i+);
printf("Yes\n");
printf("%d\n",(int)vv.size());
for (int i=;i<vv.size();++i) printf("%d ",vv[i]);
return ;
}

Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) E. National Property(2-sat)的更多相关文章

  1. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) F. High Cry(思维 统计)

    F. High Cry time limit per test 1 second memory limit per test 512 megabytes input standard input ou ...

  2. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins

    http://codeforces.com/contest/876/problem/D 题意: 最开始有一串全部由"O"组成的字符串,现在给出n个数字,指的是每次把位置n上的&qu ...

  3. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) C. Classroom Watch

    http://codeforces.com/contest/876/problem/C 题意: 现在有一个数n,它是由一个数x加上x每一位的数字得到的,现在给出n,要求找出符合条件的每一个x. 思路: ...

  4. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) B. Divisiblity of Differences

    http://codeforces.com/contest/876/problem/B 题意: 给出n个数,要求从里面选出k个数使得这k个数中任意两个的差能够被m整除,若不能则输出no. 思路: 差能 ...

  5. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal

    http://codeforces.com/contest/876/problem/A 题意: 一个人一天要吃n次蜂蜜,他有3个朋友,他第一次总是在一个固定的朋友家吃蜂蜜,如果说没有吃到n次,那么他就 ...

  6. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

    A. Trip For Meal 题目链接:http://codeforces.com/contest/876/problem/A 题目意思:现在三个点1,2,3,1-2的路程是a,1-3的路程是b, ...

  7. ACM-ICPC (10/16) Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

    A. Trip For Meal Winnie-the-Pooh likes honey very much! That is why he decided to visit his friends. ...

  8. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth(重识搜索)

    https://codeforces.com/contest/1064/problem/D 题意 给你一个有障碍的图,限制你向左向右走的次数,问你可以到达格子的个数 思路 可以定义状态为vi[x][y ...

  9. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth

    http://codeforces.com/contest/1064/problem/D 向上/向下加0,向左/右加1, step = 0,1,…… 求的是最少的步数,所以使用bfs. step=k ...

随机推荐

  1. 设置view controller到iPhone或者iPad模式

    在写iOS程序时,view controller的显示大小以及控件大小的调节是在是一个费力的事,尤其是对于用mac本的童鞋,更难驾驭,这时我们可以根据需要设置专门针对iphone或者ipad的view ...

  2. python json 访问与字符串截取

    # req = requests.Request(url=url, headers=headers, data=data) # html = requests.get(req) # print(htm ...

  3. [OI]省选前模板整理

    省选前把板子整理一遍,如果发现有脑抽写错的情况,欢迎各位神犇打脸 :) 数学知识 数论: //组合数 //C(n,m) 在n个数中选m个的方案数 ll C[N][N]; void get_C(int ...

  4. 20155234 2016-2017-2 《Java程序设计》第6周学习总结

    20155234 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. 从应用程序角度 ...

  5. TensorFlow在win10上的安装与使用(三)

    本篇博客介绍最经典的手写数字识别Mnist在tf上的应用. Mnist有两种模型,一种是将其数据集看作是没有关系的像素值点,用softmax回归来做.另一种就是利用卷积神经网络,考虑局部图片像素的相关 ...

  6. aarch64_n1

    NFStest-2.1.5-0.fc26.noarch.rpm 2017-02-17 01:19 531K fedora Mirroring Project NLopt-2.4.2-11.fc26.a ...

  7. Runtime - Associated Objects (关联对象) 的实现原理

    主要围绕3个方面说明runtime-Associated Objects (关联对象) 1. 使用场景 2.如何使用 3.底层实现 3.1  实现原理 3.2 关联对象被存储在什么地方,是不是存放在被 ...

  8. jQuery-选择器-查找标签

    一.jQuery选择器 jQuery选择器就是帮助我们快速定位到一个或多个DOM节点 1.1  ID选择器 如果某个DOM节点有id属性,利用jQuery查找方式: <script src=&q ...

  9. 浅谈js设计模式之策略模式

    策略模式有着广泛的应用.本节我们就以年终奖的计算为例进行介绍. 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而 ...

  10. Java基础83 JSP标签及jsp自定义标签(网页知识)

    1.JSP标签 替代jsp脚本,用于jsp中执行java代码1.1.内置标签:  <jsp:forward></jsp:forward>  相当于:request.getReu ...