Luogu3825 NOI2017 游戏 2-SAT
第一眼看上去似乎是一个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的更多相关文章
- P3825 [NOI2017]游戏
题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...
- 【BZOJ4945】[Noi2017]游戏 2-SAT
[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...
- [Luogu P3825] [NOI2017] 游戏 (2-SAT)
[Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...
- bzoj3825 NOI2017 游戏
题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...
- [NOI2017]游戏(2-SAT)
这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...
- NOI2017 [NOI2017]游戏 【2-sat】
题目 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用 ...
- bzoj 4945: [Noi2017]游戏
Description Solution 首先我们发现一个位置如果不是 \('x'\),那么就只有两种选择 而 \('x'\) 的个数小于等于 \(8\),直接枚举是哪个就好了 然后就是 \(2-sa ...
- [NOI2017]游戏
题目描述 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 题解 如果说没有x的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...
- 洛谷3825 [NOI2017]游戏 2-sat
原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...
随机推荐
- Centos 6.8 系统升级默认的Python版本
1.编译安装python2.7 # wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz # Python-2.7.12.tg ...
- Java集合之TreeMap源码分析
一.概述 TreeMap是基于红黑树实现的.由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的C ...
- IDEA错误:Failed to start end point associated with ProtocolHandler [http-nio-9999] java.net.BindException: Address already in use: bind
日志显示进程端口已被占用,首先需要的是查询什么进程占用了当前的9999端口. 1.win+R输入cmd进入命令界面: 2.输入命令 netstat -ano|findstr "端口号&qu ...
- 对JS作用域和作用域链的理解
理解好javascript的变量作用域和链式调用机制对用好变量起着关键的作用,下面我来谈谈这两个概念的理解. (1)链式调用机制 作用域链的定义:函数在调用参数时会从函数内部到函数外部逐个”搜索“参数 ...
- (网页)备注在HTML页面的放置的小技巧(title属性)
其实很简单,就是title这个属性:(字符多余的剪切,title显示完整的字符) 下面是代码: <ul> <li title="江南style.江南style.江南styl ...
- (网页)理解Angular中的$apply()以及$digest()
转自CSDN: 工作有问题上CSDN上转转. $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$ ...
- OneAPM大讲堂 | 基于图像质量分析的摄像头监控系统的实现
今天咱们要介绍的技术很简单,请看场景: 你在家里安装了几个摄像头想监视你家喵星人的一举一动,然而,就在喵星人准备对你的新包发动攻击的时候,图像突然模糊了.毕竟图像模糊了以后你就没法截图回家和喵当面对质 ...
- enum类使用
状态常量类使用enum public class TestEnums{ public enum STATUS{ NOMAL("01","正常"), DELETE ...
- C#语言————第一章 第一个C#程序
第一章 第一个C#程序 ******************C#程序*************** ①:建立项目:文件-->新建-->项目-->c#-->控制台程 ...
- 减少MySQL主从延迟的神器--并行复制大揭密
1. 简介 MySQL 5.6引入了基于schema的并行复制,即如果binlog events操作的是不同schema的对象,不是DDL,且操作的对象没有对其他schema的foreign key关 ...