[2-sat]codeforces 875 C——National Property
来源:互联网 发布:专线网络 编辑:程序博客网 时间:2024/04/29 06:18
题目梗概
给出一些小写字符串,要求把一些单词改成大写,使得这些字符串的字典序与输入给出顺序相同。
解题思路
对于一个字符只有改和不改两种状态,所以马上想到2-sat。
考虑如何建边,对于相邻的两个字符串,假设找到最近的不相同的两个字符a.b。
如果a>b,那么a必须改大写,且b必须改小写。
如果a
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;inline int _read(){ int num=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=getchar(); return num*f;}const int maxn=200005;vector<int> a,b;int m,n;int tot,lnk[maxn],nxt[maxn],son[maxn];int s[maxn],dfn[maxn],low[maxn],time,top,G,scc[maxn],ans[maxn],num,h[maxn];bool ins[maxn];void add(int x,int y){nxt[++tot]=lnk[x];lnk[x]=tot;son[tot]=y;}void work(){ int i=0; while(i<a.size()&&i<b.size()&&a[i]==b[i]) i++; if (i>=a.size()||i>=b.size()){ if (a.size()>b.size()){printf("No\n");exit(0);} return; } if (a[i]<b[i]) add((b[i]-1)*2+1,(a[i]-1)*2+1),add((a[i]-1)*2,(b[i]-1)*2); if (a[i]>b[i]) add((b[i]-1)*2+1,(b[i]-1)*2),add((a[i]-1)*2,(a[i]-1)*2+1);}void tarjan(int x){ dfn[x]=++time;low[x]=time; s[++top]=x;ins[x]=1; for (int j=lnk[x];j;j=nxt[j]) if (!dfn[son[j]]){tarjan(son[j]);low[x]=min(low[x],low[son[j]]);} else if (ins[son[j]]) low[x]=min(low[x],dfn[son[j]]); if (dfn[x]==low[x]){ G++; while(s[top]!=x) scc[s[top]]=G,ins[s[top--]]=0; scc[x]=G;ins[s[top--]]=0; }}int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); m=_read(),n=_read(); for (int i=1;i<=m;i++){ int x=_read();b.clear(); for (int j=1;j<=x;j++) b.push_back(_read()); if (i>1) work(); a=b; } for (int i=0;i<2*n;i++) if (!dfn[i]) tarjan(i); for (int i=0;i<n;i++) if (scc[2*i]==scc[2*i^1]){printf("No\n");return 0;} else if (scc[2*i]<scc[2*i^1]) ans[i+1]=0;else ans[i+1]=1; printf("Yes\n"); for (int i=1;i<=n;i++) if (ans[i]) h[++num]=i; printf("%d\n",num); for (int i=1;i<=num;i++) printf("%d ",h[i]); return 0;}
阅读全文
0 0
- [2-sat]codeforces 875 C——National Property
- Codeforces Round #441 Div1 C:National Property (2-SAT)
- [2-SAT] Codeforces #876E. National Property
- 【2-SAT】Codeforces 876E National Property
- codeforces National Property 2sat模板题
- Codeforces Round #441 (Div. 1) C:National Property(2-SAT)
- Codeforces 876 E National Property(2-SAT)
- Codeforces 876 E. National Property (2-SAT)
- Codeforces 875C National Property 乱搞
- Codeforces 875C National Property 题解
- [2-SAT] Codeforces875C.National Property
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) E. National Property (2-SAT问题)
- Codeforces 876E National Property【思维建图+2-sat+输出可行解】好题~
- Codeforces Round #441 E. National Property (2-sat tarjan后输出任意一组合法解)
- CF875C National Property(简化版的2-sat)
- Codeforces 876E National Property
- Codeforces Round #441 (Div. 2): E. National Property(模拟?)
- Codeforces Round #441 (Div. 2)-E-National Property(模拟)
- MFC透明贴图问题
- Java 虚拟机学习( 2 ):垃圾收集算法
- 计数排序(python)
- 【芝麻信用对接】欺诈信息验证
- Guitar Pro删除的一个完整小节的操作步骤解析
- [2-sat]codeforces 875 C——National Property
- MYSQL删除表的记录后如何使ID从1开始
- ios 随机数生成
- 动态代理与AOP(7)
- 函数的声明和定义
- 为啥css这么难学?
- 基础JavaScript练习(一)总结
- while和until的使用
- Linux环境下邮件主题、发件人中文乱码解决