\(\mathscr{Description}\)

  Link.

  给大家看个乐子: link, 懒得概括题意啦.

\(\mathscr{Solution}\)

  对于没有 X 的情况, 显然可以 2-SAT; 对于有 X 的情况, 暴力枚举这辆车属于 \(\{X,A\}\) 还是 \(\{B,C\}\), 继续 2-SAT. 复杂度 \(\mathcal O(2^d(n+m))\).

\(\mathscr{Code}\)

/* Clearink */

#include <cstdio>
#include <cstdlib> const int MAXN = 5e4, MAXM = 1e5;
int n, cx, m, xpos[10], xid[MAXN + 5];
char s[MAXN + 5]; inline void chkmin ( int& a, const int b ) { b < a && ( a = b, 0 ); } inline int id ( const int sta, const int i, const int c ) {
if ( ~xid[i] ) {
if ( ( sta >> xid[i] ) & 1 ) return c ? -1 : 0;
if ( !c ) return -1;
return ( c + 2 ) % 3;
} else {
if ( s[i] == c ) return -1;
return ( c - s[i] + 2 ) % 3;
}
} struct Restrict {
int u, a, v, b; // u use a -> v use b.
inline void read () {
char ta, tb;
scanf ( "%d %c %d %c", &u, &ta, &v, &tb ), a = ta - 'A', b = tb - 'A';
}
} restr[MAXM + 5]; struct TwoSAT {
static const int MAXND = MAXN << 1, MAXEG = MAXM << 1;
int ecnt, head[MAXND + 5], to[MAXEG + 5], nxt[MAXEG + 5];
int dfc, dfn[MAXND + 5], low[MAXND + 5], top, stk[MAXND + 5];
int scc, clr[MAXND + 5];
bool ins[MAXND + 5]; inline void clear () {
ecnt = scc = dfc = 0;
for ( int i = 1; i <= n << 1; ++i ) head[i] = dfn[i] = 0;
} inline void link ( const int s, const int t ) {
to[++ecnt] = t, nxt[ecnt] = head[s];
head[s] = ecnt;
} inline void Tarjan ( const int u ) {
int v;
dfn[u] = low[u] = ++dfc, ins[stk[++top] = u] = true;
for ( int i = head[u]; i; i = nxt[i] ) {
if ( !dfn[v = to[i]] ) Tarjan ( v ), chkmin ( low[u], low[v] );
else if ( ins[v] ) chkmin ( low[u], dfn[v] );
}
if ( dfn[u] == low[u] ) {
++scc;
do ins[v = stk[top--]] = false, clr[v] = scc; while ( u ^ v );
}
} inline bool check ( const int sta ) {
for ( int i = 1; i <= n << 1; ++i ) if ( !dfn[i] ) Tarjan ( i );
for ( int i = 1; i <= n; ++i ) if ( clr[i] == clr[i + n] ) return false;
for ( int i = 1; i <= n; ++i ) {
bool val = clr[i] > clr[i + n];
if ( !~xid[i] ) putchar ( ( s[i] + 1 + val ) % 3 + 'A' );
else if ( !( ( sta >> xid[i] ) & 1 ) ) putchar ( 1 + val + 'A' );
else putchar ( 'A' );
}
return putchar ( '\n' ), exit ( 0 ), true;
} inline void build ( const int sta ) {
clear ();
for ( int i = 0; i < cx; ++i ) {
if ( ( sta >> i ) & 1 ) {
link ( xpos[i] + n, xpos[i] ); // choose A only.
}
}
for ( int i = 1; i <= m; ++i ) {
int ia = id ( sta, restr[i].u, restr[i].a );
int ib = id ( sta, restr[i].v, restr[i].b );
if ( !~ia ) continue;
if ( !~ib ) link ( restr[i].u + ia * n, restr[i].u + ( ia ^ 1 ) * n );
else {
link ( restr[i].u + ia * n, restr[i].v + ib * n );
link ( restr[i].v + ( ib ^ 1 ) * n, restr[i].u + ( ia ^ 1 ) * n );
}
}
}
} sat; int main () {
scanf ( "%d %d %s", &n, &cx, s + 1 );
for ( int i = 1, t = 0; i <= n; ++i ) {
if ( s[i] == 'x' ) {
xpos[xid[i] = t++] = i;
s[i] = '$';
} else s[i] -= 'a', xid[i] = -1;
}
scanf ( "%d", &m );
for ( int i = 1; i <= m; ++i ) restr[i].read ();
for ( int s = 0; s < 1 << cx; ++s ) {
sat.build ( s );
if ( sat.check ( s ) ) return 0;
}
puts ( "-1" );
return 0;
}

Solution -「NOI 2017」「洛谷 P3825」游戏的更多相关文章

  1. 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】

    UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...

  2. 洛谷P3825 [NOI2017]游戏(2-SAT)

    传送门 果然图论的题永远建图最麻烦……看着题解代码的建图过程真的很珂怕…… 先不考虑地图$x$,那么每一个地图都只能用两种赛车,于是我们可以用2-SAT来搞,用$i$表示这个地图能用的第一辆车,$i' ...

  3. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  4. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  5. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  6. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  7. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  8. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  9. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  10. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

随机推荐

  1. house of stom

    完成事项 house of stom学习 未完成事项 wmctf的blineless没打通 如何解决未完成事项 下周待做事项 house of orange house of lore 本周学习的知识 ...

  2. 开源一款AI聊天工具

    学习Spring AI项目,开发一款问答工具 AI大模型请注册并生成API密钥 获取API密钥地址:https://bigmodel.cn/console/overview 开源地址:LuckyAI ...

  3. Power BI DAX 公式使用

    一.日期类 1.计算两个日期之间的差值 使用函数:DateDiff(< start_date >,< end_date >.<间隔>) 例:合同终止天数 = DAT ...

  4. vue3 js 学习笔记

    Vue3-js 学习笔记 目录 Vue3-js 学习笔记 目录 前言 reactive 数据绑定 事件绑定 生命函数周期 计算属性-computed props emit-自定义事件 ref-获取元素 ...

  5. Linux进程监控系统

    目录 动态监控进程 top 基本语法 关键信息说明 第一行:系统信息 第二行:进程信息 第三行:CPU占用情况 第四行:内存信息 第五行:交换区信息 交互操作 操作选项 应用实例 监控网络状态 net ...

  6. 基于Java+SpringBoot心理测评心理测试系统功能实现一

    一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...

  7. OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD

    前言   深入理解相机视口,摸索相机视口旋转功能,背景透明或者不透明.  本篇,实现了一个左下角旋转HUD且背景透明的相机视口.   Demo                  HUD相机的坐标    ...

  8. delphi Image32 图像采样

    图像数据采样 代码: 1 unit uFrmImageResampling; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, Win ...

  9. 鸿蒙NEXT开发案例:简体繁体转换器

    [引言] 简体繁体转换器是一个实用的小工具,它可以帮助用户轻松地在简体中文和繁体中文之间进行转换.对于需要频繁处理两岸三地文档的用户来说,这样的工具无疑是提高工作效率的好帮手.本案例将展示如何利用鸿蒙 ...

  10. Webshell流量分析之菜刀Chopper&蚁剑AntSword

    目录 中国菜刀 蚁剑 菜刀和蚁剑的一句话木马的流量都有一个特点,都没有加密的,使用wireshark抓包来分析. 中国菜刀 中国菜刀是一款经典的webshell管理工具,具有文件管理.数据库管理.虚拟 ...