【LOJ】 #2305. 「NOI2017」游戏
题解
枚举x所在的地图的颜色,然后2-SAT建边
如果v所在的地图刚好是不能选的,那么u这边只能选另一种颜色
否则就是u的颜色到v的颜色
v的另一种颜色到u的另一种颜色
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
//#define ivorysi
#define MAXN 100005
#define eps 1e-7
#define mo 974711
#define pb push_back
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
int N,D,M;
char s[MAXN],c[2][MAXN][4],L[MAXN];
int u[MAXN],v[MAXN];
struct node {
int to,next;
}E[MAXN * 2];
int head[MAXN * 2],sumE;
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
int get_id(int u,char c) {
if(s[u] == 'A') return c == 'B' ? u * 2 : u * 2 + 1;
if(s[u] == 'B') return c == 'A' ? u * 2 : u * 2 + 1;
if(s[u] == 'C') return c == 'A' ? u * 2 : u * 2 + 1;
}
char get_ch(int u) {
if(s[u / 2] == 'A') return (u & 1) ? 'C' : 'B';
if(s[u / 2] == 'B') return (u & 1) ? 'C' : 'A';
if(s[u / 2] == 'C') return (u & 1) ? 'B' : 'A';
}
int sta[MAXN],top,dfn[MAXN],low[MAXN],idx,col[MAXN],tot,instack[MAXN];
vector<int> ver[MAXN];
void tarjan(int u) {
sta[++top] = u;
dfn[u] = low[u] = ++idx;
instack[u] = 1;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(instack[v] == 1) {
low[u] = min(low[u],dfn[v]);
}
else if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u],low[v]);
}
}
if(low[u] == dfn[u]) {
++tot;
while(1) {
int x = sta[top--];
col[x] = tot;
ver[tot].pb(x);
instack[x] = 2;
if(x == u) break;
}
}
}
bool check() {
memset(head,0,sizeof(head));
sumE = 0;
for(int i = 1 ; i <= M ; ++i) {
if(c[0][i][1] == s[u[i]]) continue;
if(c[1][i][1] == s[v[i]]) {
int x = get_id(u[i],c[0][i][1]);
add(x,x ^ 1);
}
else {
int x = get_id(u[i],c[0][i][1]),y = get_id(v[i],c[1][i][1]);
add(x,y);add(y ^ 1,x ^ 1);
}
}
for(int i = 1 ; i <= tot ; ++i) ver[i].clear();
memset(sta,0,sizeof(sta));top = 0;
memset(dfn,0,sizeof(dfn));idx = 0;
memset(low,0,sizeof(low));
memset(col,0,sizeof(col));tot = 0;
memset(instack,0,sizeof(instack));
for(int i = 2 ; i <= N * 2 + 1; ++i) {
if(!dfn[i]) tarjan(i);
}
for(int i = 2 ; i <= N * 2 + 1 ; i += 2) {
if(col[i] == col[i ^ 1]) return false;
}
memset(L,0,sizeof(L));
for(int i = 1 ; i <= tot ; ++i) {
for(auto k : ver[i]) {
if(!L[k / 2]) {
L[k / 2] = get_ch(k);
}
}
}
return true;
}
bool dfs(int dep) {
if(dep > N) {
if(check()) return true;
return false;
}
if(s[dep] != 'x') {return dfs(dep + 1);}
else {
for(int i = 0 ; i <= 2 ; ++i) {
s[dep] = 'A' + i;
if(dfs(dep + 1)) return true;
}
}
return false;
}
void Init() {
scanf("%d%d",&N,&D);
scanf("%s",s + 1);
for(int i = 1 ; i <= N ; ++i) {
if(s[i] != 'x') s[i] = s[i] - 'a' + 'A';
}
scanf("%d",&M);
for(int i = 1 ; i <= M ; ++i) {
scanf("%d%s%d%s",&u[i],c[0][i] + 1,&v[i],c[1][i] + 1);
}
}
void Solve() {
if(!dfs(1)) {puts("-1");return;}
for(int i = 1 ; i <= N ; ++i) {
putchar(L[i]);
}
putchar('\n');
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}
【LOJ】 #2305. 「NOI2017」游戏的更多相关文章
- loj #2305. 「NOI2017」游戏
#2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...
- loj#2305. 「NOI2017」游戏 2-sat
链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...
- LOJ_2305_「NOI2017」游戏 _2-sat
LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...
- 「NOI2017」游戏
「NOI2017」游戏 题目描述 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 \(A\).\(B\).\ ...
- LOJ2305 「NOI2017」游戏
「NOI2017」游戏 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行$n$场 ...
- 「NOI2017」游戏 解题报告
「NOI2017」游戏 \(d\)这么小,你考虑直接对\(d\)个东西暴力 枚举\(x\)为\(a\)或\(b\)(\(c\)就不用了,因为\(a,b\)已经包含\(c\))了,剩下的就是个\(2-s ...
- LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推
题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...
- LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表
题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...
- LOJ 2302 「NOI2017」整数——压位线段树
题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...
随机推荐
- 应用jfinal时要注意区分Db.query和Db.find
jfinal有一个特别好的地方,sql查询的时候可以直接查record.但是要注意query和find的区别. query返回的是List<object>,find返回的才是List< ...
- 基于Ubuntu16.04搭建WordPress
安装 Apache2 在终端输入该命令 ,使用 apt-get 安装 Apache2: sudo apt-get install apache2 -y 安装好后,您可以通过访问实验室IP地址 http ...
- shell的父子进程
2017年1月11日, 星期三 shell的父子进程 启动/执行方式: 当前shell: #!/bin/bash 必须行首 ...
- python核心编程笔记——Chapter5
好吧,开始第五章习题: 5-2.又是老调重谈,raw_input这个函数真是非常麻烦,返回是str类型,没办法,只能在函数里面使用int内建.(就只是一道简单的两数相乘,哭了) #!/usr/bin/ ...
- FPGA基础知识8(FPGA静态时序分析)
任何学FPGA的人都跑不掉的一个问题就是进行静态时序分析.静态时序分析的公式,老实说很晦涩,而且总能看到不同的版本,内容又不那么一致,为了彻底解决这个问题,我研究了一天,终于找到了一种很简单的解读办法 ...
- java 连接Kafka报错java.nio.channels.ClosedChannelExcep
Java 客户端连接Kafka报如下错误 java.nio.channels.ClosedChannelExcep 是由于Kafka server.properties中的advertised.hos ...
- Happy Matt Friends(HDU5119 + dp)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5119 题目: 题意: 求选择任意个数,使其异或和大于等于m的方案数. 思路: 每个数有选和不选两种方 ...
- supervisor简洁用例
supervisor是什么 superviosr是一个Linux/Unix系统上进程监控和管理的工具,它由python编写,可以用pip安装.supervisor能将一个普通的命令行进程变为后台dae ...
- Dream------scala--scala内部类实战
Dream------scala--scala内部类实战 scala的内部类跟java的内部类有很大的不同,java中的内部类实际上是从属于外部类,而scala的内部类是从属于外部类对象的(及外部类实 ...
- qt中int与string的相互转换
我经常搞错这个问题,一直以为整形int b可以直接使用函数toString呢! 但是在qtCreator中在整形后面不管怎么按点(可以自动提示)他就是不给我提示,我就纳闷了这样居然不行 百度了之后才知 ...