【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 ,修改掉,再在含有 ...
随机推荐
- tensorflow变量作用域(variable scope)
举例说明 TensorFlow中的变量一般就是模型的参数.当模型复杂的时候共享变量会无比复杂. 官网给了一个case,当创建两层卷积的过滤器时,每输入一次图片就会创建一次过滤器对应的变量,但是我们希望 ...
- 转:苹果Xcode帮助文档阅读指南
一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出 ...
- WAV MP3 Converter-强大的音频转换软件-特别版
From:http://www.cnblogs.com/killerlegend/p/3873909.html Author:KillerLegend Date:2014.7.28 WAV MP3 C ...
- 我购买byd的几点逻辑
1.伯克希尔哈撒韦长期看好byd不是无道理的,每次转型都是那么的成功,说明管理层很好. 2.2015年6月员工持股计划均价55元,目前48元. 3.新能源汽车龙头. 4.云轨解决了小城市建设地铁过于浪 ...
- 解析XML文件的几种常见操作方法:DOM/SAX/DOM4j
<?xml version="1.0" encoding="utf-8"?> <root> <class name="c ...
- zookeeper图形工具——zkui
虽然zookeeper安装包提供了客户端工具zkcli,但是命令特别少 ,每次想看看里面的节点信息特别费劲. 幸好有图形工具——zkui,https://github.com/echoma/zkui, ...
- 不忘初心,方得始终——NOIP2016前的感悟
不忘初心,方得始终 袛园精舍钟声响,奏诸世事本无常.沙罗双树失花色,盛者转衰如沧桑.骄者难久,恰如春宵一梦.猛者遂灭,好似风前之尘. ——题记 人生中最令人恐惧的恐怕就是选择了,现在的你拥有 ...
- Hibernate5笔记6--Hibernate检索优化
Hibernate检索优化: 检索即查询.为了减轻DB的访问压力,提高检索效率,Hibernate对检索进行了优化. 所谓检索优化,指的是对查询语句的执行时机进行了细致.严格的把控:并不是代码中一出现 ...
- Python Challenge 第 5 关攻略:peak
# -*- coding: utf-8 -*- # @Time : 2018/9/26 14:03 # @Author : cxa # @File : pickledemo.py # @Softwar ...
- sicily 1215. 脱离地牢
Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想得到这两块石头了,只要把 ...