loj2305 NOI2017 游戏
思路
既然\(x\)的数量那么小,我们就可以先把每个\(x\)搜索一遍。
枚举x的时候不需要把\(a,b,c\)全枚举一遍,只要枚举其中的两个就可以枚举到当前位置选任何车的情况。
然后就变成了只有\('a','b','c'\)的序列。寻找满足题目要求的方案。
\(2-sat\)模型。
连边的时候注意一些技巧,否则\(if\)写到自闭。。
在\(UOJ\)上会被卡掉\(3\)分。实在懒得去卡常了233
代码
/*
* @Author: wxyww
* @Date: 2019-04-29 09:08:01
* @Last Modified time: 2019-04-30 14:32:38
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 100010;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
vector<int>e[N];
char a[N],tmp[N];
int n,D,m;
int opp[N];
#define add(x,y) e[x].push_back(y)
int val[N];
int tot,dfn[N],low[N],vis[N],sta[N],coljs,col[N],top;
void tarjan(int u) {
int k = e[u].size();
dfn[u] = low[u] = ++tot;
sta[++top] = u;vis[u] = 1;
for(int i = 0;i < k;++i) {
int v = e[u][i];
if(!dfn[v]) {
tarjan(v);low[u] = min(low[u],low[v]);
}
else if(vis[v]) low[u] = min(low[u],low[v]);
}
if(dfn[u] == low[u]) {
++coljs;
do {
int x = sta[top--];
col[x] = coljs;
vis[x] = 0;
}while(sta[top + 1] != u);
}
}
int t1[N],t2[N];
char h1[N],h2[N];
int get_u(int x,char y) {
if(a[x] == 'a') return y == 'B' ? x : x + n;
return y == 'A' ? x : x + n;
}
#define ote(x) x > n ? x - n : x + n
void solve() {
memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
memset(col,0,sizeof(col));
coljs = 0,tot = 0;top = 0;
for(int i = 1;i <= n + n;++i) e[i].clear();
for(int i = 1;i <= m;++i) {
if(a[t1[i]] == h1[i] - 'A' + 'a') continue;
int u = get_u(t1[i],h1[i]);
if(a[t2[i]] == h2[i] - 'A' + 'a') {
add(u,ote(u));
continue;
}
int v = get_u(t2[i],h2[i]);
add(u,v);add(ote(v),ote(u));
}
for(int i = 1;i <= n + n;++i) if(!dfn[i]) tarjan(i);
for(int i = 1;i <= n;++i) if(col[i] == col[i + n]) return;
for(int i = 1;i <= n;++i) {
if(col[i] < col[i + n]) {
if(a[i] == 'a') putchar('B');
else putchar('A');
}
else {
if(a[i] == 'c') putchar('B');
else putchar('C');
}
}
exit(0);
}
void dfs(int pos) {
if(pos == n + 1) {
solve();
return;
}
if(tmp[pos] != 'x') dfs(pos + 1);
else {
a[pos] = 'a';
dfs(pos + 1);
a[pos] = 'b';
dfs(pos + 1);
}
}
int main() {
// freopen("2305/game3.in","r",stdin);
n = read(),D = read();
scanf("%s",tmp + 1);
memcpy(a + 1,tmp + 1,n);
m = read();
for(int i = 1;i <= m;++i) {
t1[i] = read();h1[i] = getchar();while(h1[i] != 'A' && h1[i] != 'B' && h1[i] != 'C') h1[i] = getchar();
t2[i] = read();h2[i] = getchar();while(h2[i] != 'A' && h2[i] != 'B' && h2[i] != 'C') h2[i] = getchar();
}
dfs(1);
puts("-1");
return 0;
}
loj2305 NOI2017 游戏的更多相关文章
- 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的时候 ...
- 并不对劲的bzoj4945:loj2305:uoj317:p3825[NOI2017]游戏
题目大意 2-SAT,其中有\(d\)(\(d\leq 8\))个点是\(3-SAT\). 题解 枚举\(d\)个点不取三个中(假设三个为\(a,b,c\))的哪一个,然后整体变成做\(2-SAT\) ...
- 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的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...
随机推荐
- 记录下github 与 gitee 同时使用
参考 Gitee(码云).Github同时配置ssh key 中间有一步,创建config文件,然后测试就过不去了. 报错:Bad owner or permissions on C:\\Users\ ...
- Java连载7-变量&数据类型
一.变量 1.注意点: 在同一个“作用域”中,变量名不能重名,但是变量可以重新赋值. 2.什么是作用域? 答:描述的是变量的有效范围,在范围之内是可以被访问的,只要出了作用域就无法访问(也就是在大括号 ...
- MySQL 合并字段及列转行
数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断 ...
- javascript的数据类型检测
JavaScript有两种数据类型,分别是基本数据类型和引用数据类型.其中基本数据类型包括Undefined.Null.Boolean.Number.String和Symbol(ES6新增,表示独一无 ...
- 云原生生态周报 Vol.10 | 数据库能否运行在 K8s 当中?
业界要闻 IBM 以总价 340 亿美元完成里程碑意义的红帽收购:这是这家拥有 107 年历史的公司史上规模最大的一笔收购,该收购金额在整个科技行业的并购史上也能排到前三.在当天公布的声明中,IBM ...
- 一个人的公众号,我写了1w+
大家好,我是Bypass,一个人一直保持着写博客的习惯,为此维护了一个技术公众号,致力于分享原创高质量干货,写的内容主要围绕:渗透测试.WAF绕过.代码审计.应急响应.企业安全. 一直以来,我把它当成 ...
- 部署 asp.net 网站到 Azure
部署asp.net网站到Azure 前言 前些天一直在写一个单页面web应用程序,终于完成了,于是考虑发布到云服务器.本人没有AWS账号,遂本打算使用谷歌云.参考文档后发现官方文档给出的方式为在vis ...
- 开发技术--Python核心知识A
开发|Python核心知识A A篇,主要介绍Python基础中列表,元祖,字典,集合,字符串,I/O,条件与循环,异常处理的底层知识与使用的注意事项. 希望大家对于Python会有新的收获,本篇不同于 ...
- Docker Desktop for Windows 安装步骤
Docker Desktop for Windows 安装要求 Docker Desktop for Windows需要运行Microsoft Hyper-V.如果需要,Docker Desktop ...
- shell脚本实现自动化安装linux版本的loadrunner agent(centos6.8)
#!/bin/bash #Centos6下安装LoadRunner负载机 #@author Agoly #@date #@source 高级测试技术交流圈: yum -y install expect ...