【题目】LibreOJ

【题意】n场游戏,有三种车ABC,给定长度为n的字符串,'a'表示不能选A,'b''c'同理,'x'表示不限,至多d个'x'。有m个限制(i,hi,j,hj)表示如果第i场选择车hi,那么第j场必须选择车hj。求可行方案,或无解。n<=10^5,d<=8。

【算法】2-sat

【题解】枚举'x'是'a'或'b'(如果直接枚举选那辆车复杂度太高,不如利用2-sat来做),这样有2^d种状态。

这样确定字符串后,每场比赛就只有两种选项和m种限制,进行2-sat即可,复杂度O(2^d*m)。(因为每次要初始化,常数还挺大的,UOJ很容易被卡TLE)

2-sat算法:连边后tarjan,如果一个点和对应点属于同一个SCC则无解,否则选择所属SCC编号较小的点。(dfs出栈序就是一种逆拓扑序)

实现细节:直接对每个点开3倍点,然后标记一个点不用,标记使用点为另外两个点。还有就是如果x和x'必须强制选x'的话,x向x'连有向边就可以了(不连对称边,这样虽然没有对称性,但是不影响)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int first[N],f[N],a[N],dfn[N],low[N],st[N],belong[N],dfsnum,TOT,tot,top,A[N],B[N],C[N],D[N],n,d,m;
int id[N],op[N];
char s[N];
struct edge{int v,from;}e[N*];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
void tarjan(int x){
dfn[x]=low[x]=++dfsnum;st[++top]=x;
for(int i=first[x];i;i=e[i].from)if(!dfn[e[i].v]){
tarjan(e[i].v);
low[x]=min(low[e[i].v],low[x]);
}else if(!belong[e[i].v])low[x]=min(dfn[e[i].v],low[x]);
if(dfn[x]==low[x]){
TOT++;
while(st[top]!=x)belong[st[top--]]=TOT;
belong[st[top--]]=TOT;
}
}
bool solve(int o){
memset(f,,sizeof(f));
memset(first,,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(belong,,sizeof(belong));//
tot=;top=;TOT=;dfsnum=;
for(int i=;i<n;i++){
if(s[i]=='x')a[i]=o&,o>>=;else a[i]=s[i]-'a';
f[a[i]*n+i]=;
id[i]=(a[i]+)%*n+i;op[id[i]]=(a[i]+)%*n+i;op[op[id[i]]]=id[i];
}
for(int i=;i<=m;i++){
int x=B[i]*n+A[i]-,y=D[i]*n+C[i]-;
if(f[x]||x==y)continue;
if(A[i]==C[i]||f[y])insert(x,op[x]);
else insert(x,y),insert(op[y],op[x]);
}
for(int i=;i<n*;i++)if(!f[i]&&!dfn[i])tarjan(i);
for(int i=;i<n;i++)if(belong[id[i]]==belong[op[id[i]]])return ;
return ;
}
char s1[],s2[];
int main(){
scanf("%d%d%s%d",&n,&d,s,&m);
for(int i=;i<=m;i++)scanf("%d%s%d%s",&A[i],s1,&C[i],s2),B[i]=s1[]-'A',D[i]=s2[]-'A';//
for(int i=;i<(<<d);i++)if(solve(i)){
for(int j=;j<n;j++)
if(belong[id[j]]<belong[op[id[j]]])putchar((a[j]+)%+'A');else putchar((a[j]+)%+'A');
return ;
}
puts("-1");
return ;
}//learn from hekai

【NOI2017】游戏 2-sat算法的更多相关文章

  1. P3825 [NOI2017]游戏

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

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

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

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

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

  4. bzoj3825 NOI2017 游戏

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

  5. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  6. Unity3D 2D游戏中寻径算法的一些解决思路

    需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...

  7. 游戏碰撞OBB算法(java代码)

    业务需求      游戏2D型号有圆形和矩形,推断说白了就是碰撞检测 :      1.圆形跟圆形是否有相交      2.圆形跟矩形是否相交       3.矩形和矩形是否相交           ...

  8. cocos2d 消除类游戏简单的算法 (一)

    1. 游戏视频演示 2.三消游戏我的理解 上面视频中的游戏.我做了2个星期时间,仅仅能算个简单Demo,还有bug.特效也差点儿没有.感觉三消游戏主要靠磨.越磨越精品. 市场上三消游戏已经超级多了.主 ...

  9. 原因好消息: PSP游戏自己主动算法设计(两)

    这是我们讲的传说中的一项措施A×算法.事实上,类上传之前似小件,下面我们分析一下它去 毕竟,在游戏程序,我们从移动一个点到另一个点.和得到的轨迹的最短距离,类别似这样的算法以及几个.运营效率几乎是相同 ...

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

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

随机推荐

  1. Alpha 冲刺6

    队名:日不落战队 安琪(队长) 今天完成的任务 回收站前端界面. 明天的计划 查看个人信息界面. 还剩下的任务 信息修改前端界面. 设置界面. 遇到的困难 模拟机莫名其妙就崩了,调试了很久,后在队友的 ...

  2. Java clone() 浅拷贝 深拷贝

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  3. Spring+Netty4实现的简单通信框架

    参考:http://cpjsjxy.iteye.com/blog/1587601 Spring+Netty4实现的简单通信框架,支持Socket.HTTP.WebSocket_Text.WebSock ...

  4. 3dContactPointAnnotationTool开发日志(三三)

      添加背景图片后发现Runtime Transform Gizmo无法选中物体了:   于是改了一下EditorObjectSelection.cs中的WereAnyUIElementsHovere ...

  5. CCF——数位之和201512-1

    问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 20151220的各位数字 ...

  6. 找xpath好用的工具(比较少用,针对只能在IE上打开的网站)

    有一些网站只能在IE浏览器里打开,不像firefox那样有好多好用的插件来找元素的xpath,css path等. 当然现在IE也可以,F12出现像firebug那样的窗口,来查看元素. 这里呢在介绍 ...

  7. Sass & Scss & CSS3

    Sass & Scss & CSS3 Sass & Scss @mixin & @include & @import & variable https: ...

  8. 第204天:js---重载和多态

    一.根据arguments个数实现重载 js本身不支持重载,所以只能通过其他方式实现,arguments检测传参的个数,然后再执行不同的方式 function add() { var sum = 0 ...

  9. HDU4681_String

    这个题目是这样的. 给你三个字符串A,B,C,(C一定是A和B的一个公共子序列). 现在要求你构造出一个串D,使得D同时为A和B的子序列,且C是D的一个连续子串.求D的最大可能长度. 很简单的一个DP ...

  10. java执行cmd命令并获取输出结果

    1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...