\(\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. AI 居然说我是牛马,还画出了我牛马的一生,我绷不住了...

    今天真是服了,AI 居然敢嘲笑我是牛马,还直接甩了张大图到我脸上. 看来我的人生在 AI 眼中就是个笑话,从 "初级牛马" 一路升级到 "资深牛马".真是谢谢你 ...

  2. spring boot中使用quratz实现定时。 使用task直接调用的实现方法

    1.定义工作类 2.创建配置类,将工作对象绑定到工作明细,然后创建触发器 与工作明细进行绑定 二.使用task实现定时任务 1.启动类上开启定时功能 2.在需要定时的任务上增加Schedule注解,并 ...

  3. React h5架构

    目录 目录 初始化项目架构 React h5架构 工具 技术栈 搭建流程 一.Vite构建项目 二.添加 git 三.运行项目 四.配置 Eslint 校验代码 五.配置 Prettier 格式化代码 ...

  4. aiflow部署文档

    aiflow部署文档 一.简介 本文档用来进行aiflow项目的完全部署 二.安装环境 2.1 安装系统镜像版本 使用Centos镜像文件:CentOS-7-x86_64-DVD-1908.iso c ...

  5. 干货分享:开启PWM调光之门,一起来做呼吸灯

    PWM作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用,常用于电机控制.灯光调光.音频信号生成.加热控制等应用. 本文将以合宙低功耗4G模组经典型号--Air780E为例, ...

  6. Python 潮流周刊#77:Python 依赖管理就像垃圾场火灾?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  7. .NET LINQ分析AWS ELB日志

    前言 小明是个单纯的.NET开发,一天大哥叫住他,安排了一项任务: "小明,分析一下我们超牛逼网站上个月的所有AWS ELB流量日志,这些日志保存在AWS S3上,你分析下,看哪个API的响 ...

  8. RedisTemplate RedisConfig 序列化方式 fastjson2

    目录 Fastjson2 序列化 Redis.config RedisUtil.java fastjson和fastjson2的区别 Spring Data Redis 为我们提供了下面的Serial ...

  9. 【一步步开发AI运动小程序】二十一、如果将AI运动项目配置持久化到后端?

    说明:本文所涉及的AI运动识别.计时.计数能力,都是基于云智「Ai运动识别引擎」实现.云智「Ai运动识别」插件识别引擎,可以为您的小程序或Uni APP赋于原生.本地.广覆盖.高性能的人体识别.姿态识 ...

  10. CodeForces - 1336A Linova and Kingdom

    CodeForces - 1336A 就差一点点,很可惜,少发现个很显而易见的结论 就是一个点的价值,实际上就是(这个点的深度 - 之后的点的数目) 就是 \(depth_i - size_i\) 然 ...