对于所有的x,我们枚举他的地图类型,事实上我们只需要枚举前两种地形就可以覆盖所有的情况。

之后就变成了裸的2-sat问题。

对于一个限制,我们分类讨论:

1.h[u]不可选,跳过

2.h[v]不可选,则h[v]也不可选,将u与u‘连边,表示u不可选。

3.否则从u向v连边表示选u就必须选v,从u’向v‘连边表示选v'就必须选u’(逆否命题)。

tarjan缩点判断可行性。

输出方案按照缩点编号选择编号小的点输出即可(逆序拓扑序)。

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 400005
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
struct Edge {int to,nxt;}e[maxn*];
int head[maxn],cnt;
void add(int u,int v) {e[cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt++;}
struct Ask {int u,v;char a[],b[];}q[maxn];
int n,d,pos[maxn],m;
char s[maxn],cs[maxn];
bool flag=;
int dfn[maxn],low[maxn],tot,bel[maxn],par[maxn],l[maxn],r[maxn],sta[maxn],top,scc;
bool vis[maxn],inq[maxn];
void init() {
memset(head,-,sizeof(head));cnt=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(bel,,sizeof(bel));tot=;scc=;
memset(vis,,sizeof(vis));
memset(inq,,sizeof(inq));
}
void tarjan(int x) {
dfn[x]=low[x]=++tot;sta[++top]=x;inq[x]=;
for(int i=head[x];i>=;i=e[i].nxt) {
int to=e[i].to;
if(!dfn[to]) {
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if(inq[to]) {low[x]=min(low[x],dfn[to]);}
}
if(dfn[x]==low[x]) {
scc++;
while() {
inq[sta[top]]=;
bel[sta[top--]]=scc;
if(sta[top+]==x) break;
}
}
}
int que[maxn],fro,tail,in[maxn];
void work() {
init();
for(int i=;i<=n;i++) {
int ttmp=;
if(s[i]=='x') {s[i]=cs[i];ttmp=;}
if(s[i]=='a') {l[i]=i+n,r[i]=i+n+n;}
if(s[i]=='b') {l[i]=i,r[i]=i+n+n;}
if(s[i]=='c') {l[i]=i,r[i]=i+n;}
if(ttmp==) s[i]='x';
par[l[i]]=r[i];par[r[i]]=l[i];vis[r[i]]=vis[l[i]]=;
}
int ql,qr;
for(int i=;i<=m;i++) {
if(q[i].a[]=='A') ql=q[i].u;
else if(q[i].a[]=='B') ql=q[i].u+n;
else ql=q[i].u+n+n;
if(q[i].b[]=='A') qr=q[i].v;
else if(q[i].b[]=='B') qr=q[i].v+n;
else qr=q[i].v+n+n;
if(ql==qr) continue;
if(!vis[ql]) continue;
if(!vis[qr]) {
add(ql,par[ql]);
continue;
}
add(ql,qr);add(par[qr],par[ql]);
}
for(int i=;i<=n+n+n;i++) {if(vis[i]&&!dfn[i]) tarjan(i);}
for(int i=;i<=n+n+n;i++) {
if(!vis[i]) continue;
if(bel[i]==bel[par[i]]) return;
}
flag=;
for(int i=;i<=n;i++) {
int out=;
if(bel[l[i]]<bel[r[i]]) out=l[i];
else out=r[i];
if(out==i) printf("A");
else if(out==i+n) printf("B");
else printf("C");
}
}
void dfs(int x) {
if(x==d+) {
work();
if(flag) exit();
return;
}
cs[pos[x]]='a';dfs(x+);
cs[pos[x]]='b';dfs(x+);
}
int main() {
n=read(),d=read();
scanf("%s",s+);
for(int i=;i<=n;i++) {if(s[i]=='x') pos[++pos[]]=i;}
m=read();
for(int i=;i<=m;i++) {q[i].u=read();scanf("%s",q[i].a+);q[i].v=read();scanf("%s",q[i].b+);}
dfs();printf("-1\n");
}

[BZOJ4945][Noi2017]游戏 2-sat的更多相关文章

  1. [bzoj4945][Noi2017]游戏

    题目大意:有$n$个位置,有三种数,每个位置只可以填一种数,$d(d\leqslant8)$个位置有三种选择,其他位置只有两种选择.有一些限制,表示第$i$个位置选了某种数,那么第$j$个位置就只能选 ...

  2. 【BZOJ4945】[Noi2017]游戏 2-SAT

    [BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...

  3. P3825 [NOI2017]游戏

    题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...

  4. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  5. BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...

  6. 【bzoj4945】[Noi2017]游戏(搜索+2-sat)

    bzoj 洛谷 题意: 现在有\(a,b,c\)三种车,每个赛道可能会存在限制:\(a\)表示不能选择\(a\)类型的赛车,\(b,c\)同理:\(x\)表示该赛道不受限制,但\(x\)类型的个数$\ ...

  7. 并不对劲的bzoj4945:loj2305:uoj317:p3825[NOI2017]游戏

    题目大意 2-SAT,其中有\(d\)(\(d\leq 8\))个点是\(3-SAT\). 题解 枚举\(d\)个点不取三个中(假设三个为\(a,b,c\))的哪一个,然后整体变成做\(2-SAT\) ...

  8. bzoj3825 NOI2017 游戏

    题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...

  9. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

随机推荐

  1. Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接

    作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt2) 将用户信息数据库文件和用户 ...

  2. Codeforces Round #410 (Div. 2)A B C D 暴力 暴力 思路 姿势/随机

    A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. HDU1536:S-Nim(sg函数)

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. Mac(Linux)上安装memcached步骤

    Mac上安装memcached类似于在Linux平台上安装memcached. 主要需要做两块: 一.安装libevent库: 二.安装memcached; 一.安装libevent库 libeven ...

  5. [吴恩达机器学习笔记]12支持向量机2 SVM的正则化参数和决策间距

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.2 大间距的直观理解- Large Margin I ...

  6. java类的静态属性值获取

    获取某个类实例的静态属性: public class ErrorCode { private String code; private String message; private ErrorCod ...

  7. easyui 更改dialog弹出的位置

    方法一: 在弹出dialog的时候不用$('#dialogDiv').dialog('open');打开.用$('#dialogDiv').window('open');打开.再用window的res ...

  8. WPF技术点

    常用Path路径 正三角形(左):<Path Data="M40,0 L0,30 40,60 z" Stretch="Uniform"/> 正三角形 ...

  9. JS操作CSS随机改变网页背景

    今天有个朋友在weibo上问我可不可以用JS和CSS让页面每次刷新随机产生一张背景图,当然我的回答是可以的.具体可以这样做: 1.用JS定义一个图片数组,里面存放你想要随机展示的图片 1 2 3 4 ...

  10. 关于Java泛型深入理解小总结

    1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声 ...