链接

https://loj.ac/problem/2305

https://www.luogu.org/problemnew/show/P3825

思路

3-sat神马的就不要想了,NP问题

除去x每个点只有两种可能,2-sat

x只有8个,\(3^n\)暴力枚举哪个不选

2-sat是对称性的

当起点x的战车不存在,continue

else 当终点的战车不存在,那么起点战车也不能选呀(选了就G了呀),起点连向剩下的那个可选点

else 起点终点都还在,连起来,否逆命题:原命题为:若a,则b。逆否命题为:若非b,则非a。

所以他俩的兄弟还要连一条边

但是计算一下发现,有点小超时呀

其实只要枚举A和B(随便两个)就好了

因为一个点最终只会用一辆车呀(有一辆就是个摆设)

\(2^n\)已经把所有可以选的情况整出来了

然后开心的\(O(2^n(n+m))\)

其他的

难道我天生就是制造bug的吗



后记:

uojTLE1个(貌似要随机化,输出,不管了)

luoguwrong1个(spj没判回车)

bzojok

lojok

代码

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,d,head[N<<2],tot;
int top,cnt,stak[N],low[N],dfn[N],belong[N];
bool vis[N],Choose[N];
char s[N],S[N];
struct node {
int v,nxt;
}e[N<<2];
struct edge {
int i,x,j,y;
}ABC[N];
void add(int u,int v) {
swap(u,v);
e[++tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
void tarjan(int u) {
low[u]=dfn[u]=++cnt;
stak[++top]=u;
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(vis[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]) {
++belong[0];
while(stak[top]!=u) {
vis[stak[top]]=0;
belong[stak[top]]=belong[0];
top--;
} top--;
vis[u]=0;
belong[u]=belong[0];
}
}
void Clear() {
memset(head,0,sizeof(head));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
memset(belong,0,sizeof(belong));
cnt=top=tot=belong[0]=0;
}
int mmp[5][2]={ {1,2},
{0,2},
{0,1},};
void solve() {
int js=1;
for(int i=1;i<=n;++i) {
if(s[i]=='x'-'a') {
if(Choose[js]==0) S[i]=0;
else S[i]=1;
} else S[i]=s[i];
}
for(int i=1;i<=m;++i) {
if(ABC[i].x==S[ABC[i].i]) continue;
int tmp_1= (mmp[S[ABC[i].i]][1]==ABC[i].x) ? mmp[S[ABC[i].i]][0] : mmp[S[ABC[i].i]][1];
int tmp_2= (mmp[S[ABC[i].j]][1]==ABC[i].y) ? mmp[S[ABC[i].j]][0] : mmp[S[ABC[i].j]][1];
if(ABC[i].y==S[ABC[i].j]) add(ABC[i].i+n*ABC[i].x,ABC[i].i+n*tmp_1);
else {
add(ABC[i].i+n*ABC[i].x,ABC[i].j+n*ABC[i].y);
add(ABC[i].j+n*tmp_2,ABC[i].i+n*tmp_1);
}
}
for(int i=1;i<=3*n;++i) {
// if(S[(i-1)/3+1]==(i+2)%3) continue;一定没有这一句
if(!dfn[i])
tarjan(i);
}
for(int i=1;i<=n;++i) {
if(belong[i+n*(mmp[S[i]][0])]==belong[i+n*(mmp[S[i]][1])]) return;
// if(S[i]=='a'&&belong[i+n]==belong[i+2*n]) return;
// if(S[i]=='b'&&belong[i]==belong[i+2*n]) return;
// if(S[i]=='c'&&belong[i]==belong[i+n]) return;
}
for(int i=1;i<=n;++i) {
if(S[i]==0) {
if(belong[i+n]>belong[i+2*n]) printf("B");
else printf("C");
}
if(S[i]==1) {
if(belong[i]>belong[i+2*n]) printf("A");
else printf("C");
}
if(S[i]==2) {
if(belong[i]>belong[i+n]) printf("A");
else printf("B");
}
}
exit(0);
}
int main() {
// freopen("a.in","r",stdin);
n=read(),d=read();
for(int i=1;i<=n;++i) {
char dd;
scanf("%c",&dd);
s[i]=dd-'a';
}
m=read();
for(int i=1;i<=m;++i) {
char s;
ABC[i].i=read();
s=getchar();
while(s==' ') s=getchar();
ABC[i].x= (s=='A') ? 0 : (s=='B') ? 1 : 2;
ABC[i].j=read();
s=getchar();
while(s==' ') s=getchar();
ABC[i].y= (s=='A') ? 0 : (s=='B') ? 1 : 2;
//end
}
for(int i=0;i<(1<<d);++i) {
for(int j=0;j<d;++j) Choose[j+1]=(bool)(1<<j)&i;
Clear();
solve();
}
puts("-1");
return 0;
}

loj#2305. 「NOI2017」游戏 2-sat的更多相关文章

  1. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  2. 【LOJ】 #2305. 「NOI2017」游戏

    题解 枚举x所在的地图的颜色,然后2-SAT建边 如果v所在的地图刚好是不能选的,那么u这边只能选另一种颜色 否则就是u的颜色到v的颜色 v的另一种颜色到u的另一种颜色 代码 #include < ...

  3. LOJ_2305_「NOI2017」游戏 _2-sat

    LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...

  4. 「NOI2017」游戏

    「NOI2017」游戏 题目描述 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 \(A\).\(B\).\ ...

  5. LOJ2305 「NOI2017」游戏

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

  6. 「NOI2017」游戏 解题报告

    「NOI2017」游戏 \(d\)这么小,你考虑直接对\(d\)个东西暴力 枚举\(x\)为\(a\)或\(b\)(\(c\)就不用了,因为\(a,b\)已经包含\(c\))了,剩下的就是个\(2-s ...

  7. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  8. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  9. LOJ 2302 「NOI2017」整数——压位线段树

    题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...

随机推荐

  1. c# 使用MS SqlServer,连接成功,但是还报异常A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0。。。。

    c# 使用MS SqlServer,连接成功,但是还报异常A connection was successfully established with the server, but then an ...

  2. 在TensorFlow中运行程序多次报错:AttributeError: __exit__

    我没有记住语句 with tf.Session() as sess: 多次写成了 with tf.Session as sess: 吃括号这个低级的错误又犯了,真不应该,立下flag:以后再犯相同的错 ...

  3. C++/Java线程之分

    JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...

  4. UITableView 的坑

    1.cell的view和contentView的区别 1.1 addSubView UITableViewCell实例上添加子视图,有两种方式:[cell addSubview:view]或[cell ...

  5. LoadLibrary加载动态库失败

    [1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...

  6. mac下编译cpu only caffe并用xCode建caffe工程

    mac编译caffe 好像又变容易了,直接git clone下载blvc源码,make.config里去掉了CPU_ONLY前面的注释,并没有安装任何依赖,也可能是自己mac上本来有, xCode里调 ...

  7. restful的特点

    1. 资源(Resources) REST的名称”表现层状态转化”中,省略了主语.”表现层”其实指的是”资源”(Resources)的”表现层”.                所谓”资源”,就是网络 ...

  8. DataBase(28)

    1.数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立.使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完 ...

  9. 利用iOS中Safari浏览器创建伪Web App

    在safari浏览器里有一个“添加到主屏幕”选项,我们可以用来创建伪Web App,下面来了解一下iOS中Safari的私有属性 第一步设置Web App的主屏幕图标: 有两种属性值apple-tou ...

  10. vue 父子组件

    组件 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊 ...