传送门


第一眼看上去似乎是一个3-SAT问题

然而\(d \leq 8\)给我们的信息就是:暴力枚举

枚举\(x\)型地图变成\(a\)型地图还是\(b\)型地图(实际上不要枚举\(c\),因为\(ab\)两种地图已经包含了选择\(ABC\)三辆车的情况),对于每一种情况跑2-SAT即可。复杂度\(O(2^d(n+m))\)

还有为什么UOJ的Hack那么强啊QAQ

随机化要么WA EX5要么WA EX8,不随机化TLE EX9

UPD:在Itst的重构之后终于过了UOJ的Hack,只是不知道为什么数组一定要开\(10^5\)

#include<bits/stdc++.h>
//this code is written by Itst
using namespace std;

int read(){
    int a = 0;
    char c = getchar();
    while(!isdigit(c)) c = getchar();
    while(isdigit(c)){
        a = a * 10 + c - 48;
        c = getchar();
    }
    return a;
}

char getc(){
    char c = getchar();
    while(!isupper(c)) c = getchar();
    return c;
}

const int MAXN = 1e5 + 3;
struct Edge{
    int end , upEd;
}Ed[MAXN << 2];
struct que{
    int a , tpa , b , tpb;
}now[MAXN << 1];
char s[MAXN];
int dfn[MAXN << 1] , low[MAXN << 1] , in[MAXN << 1] , head[MAXN << 1];
int N , M , D , ts , cntEd , cntSCC , X[9];
int stk[MAXN << 1] , top;
bool vis[MAXN << 1] , ins[MAXN << 1];

void addEd(int a , int b){
    Ed[++cntEd] = (Edge){b , head[a]};
    head[a] = cntEd;
}

void clear(){
    memset(head , 0 , sizeof(head));
    memset(vis , 0 , sizeof(vis));
    memset(ins , 0 , sizeof(ins));
    memset(in , 0 , sizeof(in));
    cntSCC = cntEd = ts = top = 0;
}

bool pop(int tar){
    ++cntSCC;
    do{
        int t = stk[top];
        in[t] = cntSCC;
        if(in[t > N ? t - N : t + N] == in[t])
            return 0;
    }while(stk[top--] != tar);
    return 1;
}

int ind(int x , int p){
    if(s[x] != 'c') return (p == 2) * N + x;
    return (p == 1) * N + x;
}

bool tarjan(int x){
    vis[x] = ins[x] = 1;
    dfn[x] = low[x] = ++ts;
    stk[++top] = x;
    for(int i = head[x] ; i ; i = Ed[i].upEd){
        if(!vis[Ed[i].end]){
            if(!tarjan(Ed[i].end)) return 0;
        }
        else if(!ins[Ed[i].end]) continue;
        low[x] = min(low[x] , low[Ed[i].end]);
    }
    ins[x] = 0;
    if(dfn[x] == low[x])
        return pop(x);
    return 1;
}

bool work(){
    for(int i = 1 ; i <= M ; ++i){
        bool f1 = now[i].tpa == s[now[i].a] - 'a' , f2 = now[i].tpb == s[now[i].b] - 'a';
        if(f1) continue;
        if(f2){
            int pos = ind(now[i].a , now[i].tpa);
            addEd(pos , now[i].a * 2 + N - pos);
        }
        int posA = ind(now[i].a , now[i].tpa) , posB = ind(now[i].b , now[i].tpb);
        addEd(posA , posB); addEd(now[i].b * 2 + N - posB , now[i].a * 2 + N - posA);
    }
    for(int i = 1 ; i <= 2 * N ; ++i)
        if(!vis[i] && !tarjan(i)) return 0;
    return 1;
}

void output(){
    for(int i = 1 ; i <= N ; ++i)
        if(in[i] > in[i + N])
            putchar(s[i] == 'c' ? 'B' : 'C');
        else putchar(s[i] == 'a' ? 'B' : 'A');
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
    //freopen("out","w",stdout);
#endif
    N = read(); read();
    scanf("%s" , s + 1);
    for(int i = 1 ; i <= N ; ++i)
        if(s[i] == 'x')
            X[++D] = i;
    M = read();
    for(int i = 1 ; i <= M ; ++i){
        now[i].a = read(); now[i].tpa = getc() - 'A';
        now[i].b = read(); now[i].tpb = getc() - 'A';
    }
    for(int i = 0 ; i < 1 << D ; ++i){
        for(int j = 1 ; j <= D ; ++j)
            s[X[j]] = (i >> (j - 1) & 1) + 'a';
        if(work()){
            output();
            return 0;
        }
        clear();
    }
    puts("-1");
    return 0;
}

Luogu3825 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. [NOI2017]游戏(2-SAT)

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

  6. NOI2017 [NOI2017]游戏 【2-sat】

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

  7. bzoj 4945: [Noi2017]游戏

    Description Solution 首先我们发现一个位置如果不是 \('x'\),那么就只有两种选择 而 \('x'\) 的个数小于等于 \(8\),直接枚举是哪个就好了 然后就是 \(2-sa ...

  8. [NOI2017]游戏

    题目描述 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 题解 如果说没有x的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...

  9. 洛谷3825 [NOI2017]游戏 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...

随机推荐

  1. 【读书笔记】iOS-xib,自动布局(二)

    我们紧接着上面的文章来写. 一,此时没有选择自动布局的时候 . 二,选中Use Auto Layout.如下图所示. 三,自动布局与不自动布局最明显的区别是右下角多了4个按钮.如图所示. 四,设置On ...

  2. 网络基础 cookie详解

    cookie详解 by:授客 QQ:1033553122 cookie干嘛用的? 参见文章http 会话(session)详解: 网络基础 http 会话(session)详解   cookie分类 ...

  3. MVC与单元测试实践之健身网站(四)-动作管理

    网站后台负责进行动作的管理,包括动作名称.介绍.训练要点.配图等内容,以便前台能够使用这些内容.在上一篇< Fit项目图片上传和云存储的调通>中已经准备好了这里涉及到的主要技术难点,现在就 ...

  4. Python:GUI之tkinter学习笔记2界面布局显示

    相关内容: pack 介绍 常用参数 使用情况 常用函数 grid 介绍 常用参数 使用情况 常用函数 place 介绍 常用参数 使用情况 常用函数 首发时间:2018-03-04 14:20 pa ...

  5. JavaScript大杂烩0 - WEB基础知识

    1. 协议小结:HTTP协议与TCP/IP协议 现代Web应用开发的基础是HTTP协议,那么HTTP协议与我们熟知的TCP/IP协议有什么关系呢? 这个要从网络通信模型说起,简单的说,计算机通信就像两 ...

  6. python第四天 三级菜单新思路

    今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了! 2017-5-10发现之前的代码有BUG今天 修改了! 作业要求 ...

  7. 修改sqlserver2008数据库的排序规则 (转)

    修改sqlserver2008数据库的排序规则 (转)      修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL S ...

  8. 第五章 绘图基础(DEVCAPS1)

    获取设备环境的信息 //DEVCAPS1.C--Device Capabilities Display Program No.1 (c) Charles Petzold, 1998 #include ...

  9. 【PAT】B1074 宇宙无敌加法器(20 分)

    打一开始做就听人说这个难,吓得我把它放到了最后做,不过如此嘛. 这里说说样例的坑点 1.最后结果可能高位有0:例如样例结果07201 2.结果会进位, 3.有可能结果是0,(此处取决于你的输出方式) ...

  10. 【C++学习笔记】变量初始化规则

    全局变量和静态变量会自动初始化为0,堆和栈中的局部变量不会初始化而拥有不可预测的值. C++保证了所有对象与对象成员都会初始化,但其中基本数据类型的初始化还得依赖于构造函数(或初始化列表). 成员变量 ...