P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress
题意: 给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 “支持或反对某法案”, 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代表不能若是有的解中法案可以通过, 有些不能则输出“?”
哇这题确认过眼神, 遇上对的测评机莫名洛谷 \(RANK 1\)
首先若是没有输出 \(?\) 这题就是一个裸的 限制条件为或 的 \(2-SAT\), 关键是我们如何处理这个 “可以在不同的解中为不同的状态”
回想一下在2-SAT里提到过的 ** \(Tarjan\) 的过程就是逻辑推理的过程 ,** 若是点 \(v\) 能由 \(u\) 到达, 那我们认为 **满足意义 \(u\) 则一定需要满足意义 \(v\) ** , 那么我们很快就可以得到啥时候一个条件的两个状态(\(0\) 或 \(1\))没得关系了: 当 \(u\ ,\ v\) 两点不互达时, 他们之间无明确的互相限制关系
所以在确定有解以后, 我们在 \(Tarjan\) 后的 \(DAG\) 上对于一个法案的两种状态 \(dfs\) , 若不互通则此点状态任意
p.s:因为是 \(DAG\) 所以不用 \(vis[ ]\)数组
p.s.s:别忘了建新图的时候别搞自环。。。
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 2000019,INF = 1e9 + 19;
int head[maxn][2],nume = 1;
struct Node{
int v,dis,nxt;
}E[maxn << 2][2];
void add(int u,int v,int dis, int o){
E[++nume][o].nxt = head[u][o];
E[nume][o].v = v;
E[nume][o].dis = dis;
head[u][o] = nume;
}
int num, nr;
int DFN[maxn], LOW[maxn], INDEX;
int S[maxn], top;
bool ins[maxn];
int col[maxn], numc;
void Tarjan(int u){
DFN[u] = LOW[u] = ++INDEX;
S[++top] = u;ins[u] = 1;
for(int i = head[u][0];i;i = E[i][0].nxt){
int v = E[i][0].v;
if(!DFN[v])Tarjan(v), LOW[u] = min(LOW[u], LOW[v]);
else if(ins[v])LOW[u] = min(LOW[u], DFN[v]);
}
if(DFN[u] == LOW[u]){
numc++;
while(S[top + 1] != u){
col[S[top]] = numc;
ins[S[top--]] = 0;
}
}
}
bool dfs(int u, int goal){
if(u == goal)return 1;
for(int i = head[u][1];i;i = E[i][1].nxt){
int v = E[i][1].v;
if(dfs(v, goal))return 1;
}
return 0;
}
bool check(int c1, int c2){
if(!dfs(c1, c2) && !dfs(c2, c1)){
printf("?");
return 1;
}
return 0;
}
int main(){
num = RD();nr = RD();
int a, b, x, y;char c1, c2;
for(int i = 1;i <= nr;i++){
a = RD(), cin>>c1, b = RD(), cin>>c2;
if(c1 == 'Y')x = 1;else x = 0;
if(c2 == 'Y')y = 1;else y = 0;
//<< 1 | 0 -> 0 , << 1 | 1 -> 1
add(a << 1 | (x ^ 1), b << 1 | y, 1, 0);
add(b << 1 | (y ^ 1), a << 1 | x, 1, 0);
}
for(int i = 2;i <= (num << 1 | 1);i++)if(!DFN[i])Tarjan(i);
for(int i = 1;i <= num;i++){
if(col[i << 1] == col[i << 1 | 1]){
puts("IMPOSSIBLE");
return 0;
}
}
for(int u = 2;u <= (num << 1 | 1);u++){
for(int i = head[u][0];i;i = E[i][0].nxt){
int v = E[i][0].v;
if(col[u] == col[v])continue;
add(col[u], col[v], 1, 1);
}
}
for(int i = 1;i <= num;i++){
if(check(col[i << 1], col[i << 1 | 1]))continue;
if(col[i << 1] < col[i << 1 | 1])printf("N");
else printf("Y");
}
puts("");
return 0;
}
P3007 [USACO11JAN]大陆议会The Continental Cowngress的更多相关文章
- Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意 题意翻译 简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为"支持 ...
- P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)
简述:给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 “支持或反对某法案”, 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代 ...
- [BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT)
[BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT) 题面 题面较长,略 分析 考虑把问题转化成一个依赖性问题 我们把每只奶牛投出 ...
- [USACO11JAN]大陆议会The Continental Cowngress_2-sat
[USACO11JAN]大陆议会The Continental Cowngress_2-sat 题意: 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会. 议会以“每头 ...
- 智课雅思词汇---十二、vent是什么意思
智课雅思词汇---十二.vent是什么意思 一.总结 一句话总结:词根:ven, vent = come, 表示“来” 词根:vent = wind 风 1.tact是什么意思? 词根:-tact-, ...
- COGS1008. 贪婪大陆[树状数组 模型转换]
1008. 贪婪大陆 ★★ 输入文件:greedisland.in 输出文件:greedisland.out 简单对比时间限制:1 s 内存限制:128 MB 试题四:贪婪大陆 [题 ...
- BZOJ1922 [Sdoi2010]大陆争霸
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...
- C++之路进阶——bzoj2199(奶牛议会)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
随机推荐
- (第十周)评论Beta发布
本人所在组:奋斗吧兄弟 按课上展示的顺序对每组进行点评: 1. 飞天小女警 项目:礼物挑选工具 相对于alpha发布时有了很大的进步.项目的界面很漂亮,这个项目的想法很新颖,我很喜欢.礼物的挑选给出 ...
- Fourteenth scrum meeting
闫昊 今日完成:整理上一阶段代码,规划第二阶段实施过程 明日完成:学习讨论区开发 唐彬 今日完成:整理上一阶段代码,规划第二阶段实施过程 明日完成:学习学习进度部分开发 史烨轩 今日完成:整理上一阶段 ...
- JavaScript实现大整数减法
继上一篇博文写了大整数加法之后,我又模拟上篇博文的算法,自己实现了大整数减法. 大整数减法相对于加法来说,稍微复杂一点.由于要考虑一些情况: 1. 两个数相减,可能会出现结果为正.负和0三种情况: 2 ...
- HDU 2159 FATE 完全背包
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2159 FATE Time Limit: 2000/1000 MS (Java/Others)Memo ...
- Teamwork(The sixth day of the team)
每日列会过后,我们的工作进度都有所进展了,好开心,但是还不是我们想要的,我们想做得更快,更好.
- Internet History, Technology and Security (Week 6)
Week 6 Technology: Transport Control Protocol (TCP) Welcome to Week 6 of IHTS. We are in our second ...
- Python入门:参数传递方式
这是关于Python的第5篇文章,主要介绍下参数传递方式和如何设计自己的函数. (一) 本篇主要介绍2种参数传递方式. 位置参数 调用函数时,根据函数定义的参数位置来传递参数. def right_t ...
- JMeter性能测试基础 (2) - 变量的使用
在使用JMeter进行性能测试时,一般情况下要保证样本容量尽可能大,这样才能得到一个比较合理的结果.也就是说,我们不能只对同一个URL进行多次访问,而是要对统一模块下尽可能多的URL进行访问,以取得相 ...
- 使用testng多线程来测试成交编号重复的问题
1.首先编写一个测试用的 function CREATE OR REPLACE FUNCTION getDealmainNo_test(dealdate IN varchar2, productcod ...
- [转帖].net 4.8 将不再支持win7 win8 版本
ZT:https://blogs.msdn.microsoft.com/dotnet/2018/07/18/announcing-net-framework-4-8-early-access-buil ...