Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress
题意
题意翻译
简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为“支持或反对某法案”,每头牛需要至少满足一个表决,不可能成立的话输出IMPOSSIBLE,否则输出方案,\(Y\)代表能,\(N\)代表不能。若是有的解中法案可以通过,有些不能则输出“?”。
由于对\(Farmer\ John\)的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会。
议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统:\(M\)只到场的奶牛\((1\leq M\leq 4000)\)会给\(N\)个议案投票\((1\leq N\leq 1,000)\)。每只奶牛会对恰好两个议案\(B_i\ and\ C_i (1\leq B_i\leq N;1\leq C_i\leq N)\)投 出“是”或“否”(输入文件中的\('Y'\)和\('N'\))。
他们的投票结果分别为\(VB_i(VB_i\in {'Y', 'N'})and\ VC_i (VC_i\in {'Y', 'N'})\)。最后,议案会以如下的方式决定:每只奶牛投出的两票中至少有一票和最终结果相符合。 例如\(Bessie\)给议案\(1\)投了赞成\('Y'\),给议案\(2\)投了反对\('N'\),那么在任何合法的议案通过方案中,必须满足议案\(1\)必须是\('Y'\)或者议案\(2\)必须是\('N'\)(或者同时满足)。
给出每只奶牛的投票,你的工作是确定哪些议案可以通过,哪些不能。
如果不存在这样一个方案, 输出IMPOSSIBLE。
如果至少有一个解,输出:\(Y\)如果在每个解中,这个议案都必须通过;\(N\)如果在每个解中,这个议案都必须驳回;"?"如果有的解这个议案可以通过,有的解中这个议案会被驳回。
输入输出格式
输入格式:
- Line \(1\): Two space-separated integers: \(N\) and \(M\)
- Lines \(2\dots M+1\): Line \(i+1\) describes cow \(i\)'s votes with four
space-separated fields -- an integer, a vote, another integer, and another vote: \(B_i,VB_i,C_i,VC_i\)
输出格式:
- Line 1: A string with N characters, where the ith character is either a \('Y'\) if the \(i\)th bill must pass, an \('N'\) if the \(i\)th bill must fail, or a '?' if it cannot be determined whether the bill passes from these votes.
If there is no solution which satisfies every cow, then output the single line IMPOSSIBLE.
输入输出样例
输入样例#1:
3 4
1 Y 2 N
1 N 2 N
1 Y 3 Y
1 Y 2 Y
输出样例#1:
YN?
思路
关于\(2-SAT\)问题的学习请参照博客:Luogu P4782 【模板】2-SAT 问题(2-SAT)。
\(2-SAT\)问题,难点在于要给出准确判定。在这里给出一个\(O(n^2)\)的做法:判断能否从\(a\)到达\(a+n\),以及能否从\(a+n\)到达\(a\)。如果能从\(a\)到达\(a+n\),则选择\(a+n\);如果能从\(a+n\)到达\(a\),则选择\(a\);否则,输出"?"。
判断能否到达,缩点之后\(dfs\)就好了。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2005,MAXM=10005;
int n,m,tot,js,dfn[MAXN],low[MAXN],bel[MAXN];
int cnt,top[MAXN],to[MAXM],nex[MAXM];
int _cnt,_top[MAXN],_to[MAXM],_nex[MAXM];
bool vis[MAXN];
stack<int>S;
int read()
{
int re=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
char readc()
{
char ch=getchar();
while(!isalpha(ch)) ch=getchar();
return ch;
}
void add_edge(int x,int y){to[++cnt]=y,nex[cnt]=top[x],top[x]=cnt;}
void _add_edge(int x,int y){_to[++_cnt]=y,_nex[_cnt]=_top[x],_top[x]=_cnt;}
void tarjan(int now)
{
dfn[now]=low[now]=++tot,vis[now]=true,S.push(now);
for(int i=top[now];i;i=nex[i])
if(!dfn[to[i]]) tarjan(to[i]),low[now]=min(low[now],low[to[i]]);
else if(vis[to[i]]) low[now]=min(low[now],dfn[to[i]]);
if(dfn[now]==low[now])
{
bel[now]=++js,vis[now]=false;
while(S.top()!=now) bel[S.top()]=js,vis[S.top()]=false,S.pop();
S.pop();
}
}
bool dfs(int now,int des)
{
if(now==des) return true;
vis[now]=true;
for(int i=_top[now];i;i=_nex[i])
if(!vis[_to[i]]&&dfs(_to[i],des)) return true;
return false;
}
int main()
{
n=read(),m=read();
while(m--)
{
int x=read();char xx=readc();
int y=read();char yy=readc();
if(xx=='Y'&&yy=='Y') add_edge(x+n,y),add_edge(y+n,x);
else if(xx=='Y'&&yy=='N') add_edge(x+n,y+n),add_edge(y,x);
else if(xx=='N'&&yy=='Y') add_edge(x,y),add_edge(y+n,x+n);
else if(xx=='N'&&yy=='N') add_edge(x,y+n),add_edge(y,x+n);
}
for(int i=1;i<=(n<<1);i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++)
if(bel[i]==bel[i+n])
{
printf("IMPOSSIBLE");
return 0;
}
for(int i=1;i<=(n<<1);i++)
for(int j=top[i];j;j=nex[j])
if(bel[i]!=bel[to[j]]) _add_edge(bel[i],bel[to[j]]);
for(int i=1;i<=n;i++)
{
memset(vis,false,sizeof vis);
if(bel[i]<bel[i+n])
{
if(dfs(bel[i+n],bel[i])) putchar('Y');
else putchar('?');
}
else if(bel[i]>bel[i+n])
{
if(dfs(bel[i],bel[i+n])) putchar('N');
else putchar('?');
}
}
return 0;
}
Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress的更多相关文章
- P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意: 给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 "支持或反对某法案&q ...
- 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的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会. 议会以“每头 ...
- [luogu P2184] 贪婪大陆 [树状数组][线段树]
题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁. 小 ...
- luogu P2184 贪婪大陆
乍一不咋会 ╭(╯3╰)╮ 把地雷L到R看成一条线段 要求的就是区间内有多少条线段经过 很明显是要用[1,R]内的起点个数-[1,L-1]的终点个数 然后这起点和终点个数可以用简单的差分线段树来维护一 ...
- Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
BZOJ2200 听说加上slf优化的spfa的卡过,真的不想写这些东西. 考虑使用堆优化的dij算法. 先加上所有双向边,然后dfs一下搜出所有由双向边构成的联通块,然后加上所有的单向边,一边对所有 ...
- 智课雅思词汇---十二、vent是什么意思
智课雅思词汇---十二.vent是什么意思 一.总结 一句话总结:词根:ven, vent = come, 表示“来” 词根:vent = wind 风 1.tact是什么意思? 词根:-tact-, ...
- [Luogu] 贪婪大陆
https://www.luogu.org/problemnew/show/P2184 区间修改时只需修改区间端点的numl或numr值 区间查询x-y只需用1-y的numr - 1-(x - 1)的 ...
随机推荐
- js数学公式-曲线运动
---勾股定理 a*a + b*b =c*c ---三角函数 正弦 : sin 余弦 : cos 正切 : tan 余切 : cot 正弦定理 a/sinA = b/sinB =c/sinC = 2r ...
- [Usaco2005 Dec]Cleaning Shifts
[Usaco2005 Dec]Cleaning Shifts 给出n段区间,左右端点分别为\(l_i,r_i\),以及选取这段区间的费用\(c_i\),现在要选出若干个区间,使其完全覆盖区间\([m, ...
- bzoj1568 Blue Mary
题意:P:加入一条一次函数.Q:询问x位置的最大函数值. 标程: #include<bits/stdc++.h> using namespace std; ; int q,x,n; dou ...
- 【luoguP4721】分治 FFT
description 给定长度为\(n-1\)的数组\(g[1],g[2],..,g[n-1]\),求\(f[0],f[1],..,f[n-1]\),其中 \[f[i]=\sum_{j=1}^if[ ...
- 把云数据库带回家!阿里云发布POLARDB Box数据库一体机
9月26日,2019杭州云栖大会上,阿里云宣布正式推出高性能数据库一体机——POLARDB Box,用户部署在自有数据中心即可享受云数据库的便捷体验,同时还为Oracle等传统数据库用户提供一键迁移功 ...
- thinkphp 自动加载
在3.2中,基本上无需手动加载类库文件,你可以很方便的完成自动加载. 命名空间自动加载 系统可以通过类的命名空间自动定位到类库文件,例如: 我们定义了一个类 Org\Util\Auth 类: name ...
- Linux课程---15、域名相关
Linux课程---15.域名相关 一.总结 一句话总结: 先购买域名,再备案,再解析,域名即可使用 1.域名备案是怎么回事(比如二级域名,三级域名)? 每个二级域名需要备案一次,三级域名不需要备案, ...
- 【转载】flex布局超过显示省略号
<div class="main"> <div class="content"> <h4 class="name&quo ...
- docker上安装ActiveMQ
1.查看是否已经存在镜像 docker images 2.搜索镜像 docker search activemq 3.拉取镜像 docker pull webcenter/activemq 4.构建容 ...
- angularJS ng-repeat="item in XXX track by $index"问题记录
参考:https://blog.csdn.net/lunhui1994_/article/details/80236315 问题:项目中对数据做了分页效果,理想是:当页数大于6时,隐藏>6的页数 ...