【题解】NOI2017游戏
2-SAT。洛谷P3845
一开始以为——怎么有3个呢?后来发现因为每个地图都有一种车是不能用的,所以就等于每一个地图都有两个适应的车啦。
那么对于x类型的地图呢——只有8个,直接2^8暴力枚举每一种可能,就转化为了普通的问题。
令u,u'分别为一个地图适应的两种车,那么对于一个要求h1 - d1, h2 - d2而言,如果第一个既不是u,也不是u’,说明可以无视;如果第二个都不能满足,
就连d1 - d1',表示如果必须选第一辆,问题无解。其余情况则d1-d2,d2'-d1'(重要!保证图的对偶性)
#include <bits/stdc++.h>
using namespace std;
#define maxn 500050
int n, timer, dep[maxn], m, cnp = , d1[maxn], d2[maxn], c1[maxn], c2[maxn], cnt, a[maxn];
int low[maxn], dfn[maxn], num[maxn];
int sum;
int head[maxn];
bool flag = false, vis[maxn], mark[maxn];
string s;
char tem1[], tem2[];
stack <int> st; struct edge
{
int last, to;
}E[maxn]; void add(int u, int v)
{
E[cnp].to = v, E[cnp].last = head[u]; head[u] = cnp ++;
} int getid(int r, int col)
{
if(a[r] == col) return ;
else if(a[r] == ) return * r + col - ;
else if(a[r] == ) return * r + col / ;
else return * r + col;
} void tarjan(int u)
{
dep[u] = dfn[u] = low[u] = ++ timer;
vis[u] = mark[u] = true;
st.push(u);
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(vis[v])
{ if(mark[v] && low[u] > dfn[v]) low[u] = dfn[v]; }
else
{
tarjan(v);
low[u] = min(low[v], low[u]);
}
}
if(dfn[u] == low[u])
{
int j;
++ cnt;
do
{
j = st.top();
st.pop();
num[j] = cnt;
mark[j] = false;
}while(!st.empty() && j != u);
}
} void init()
{
memset(head, , sizeof(head));
memset(dep, , sizeof(dep));
cnt = timer = , cnp = ;
memset(vis, , sizeof(vis));
} void solve()
{
init();
for(int i = ; i <= m; i ++)
{
int x = getid(d1[i], c1[i]), y = getid(d2[i], c2[i]);
if(x)
{
if(y) add(x, y), add(y ^ , x ^ );
else add(x, x ^ );
}
}
for(int i = ; i <= * n + ; i ++)
if(!vis[i]) tarjan(i);
for(int i = ; i <= n; i ++)
if(num[i * ] == num[i * ^ ]) return;
flag = true;
for(int i = ; i <= n; i ++)
{
if(a[i] == ) putchar(num[i * ] < num[i * ^ ] ? 'B' : 'C');
else if(a[i] == ) putchar(num[i * ] < num[i * ^ ] ? 'A' : 'C');
else putchar(num[i * ] < num[i * ^ ] ? 'A' : 'B');
}
return;
} void dfs(int x)
{
if(flag) return;
if(x > n)
{
solve();
return;
}
if(a[x] == -) a[x] = , dfs(x + ), a[x] = ;
dfs(x + );
} int main()
{
string s;
int d;
cin >> n >> d;
cin >> s;
n = s.length();
for(int i = ; i < n; i ++)
{
if(s[i] == 'a') a[i + ] = ;
else if(s[i] == 'b') a[i + ] = ;
else if(s[i] == 'c') a[i + ] = ;
else a[i + ] = -;
}
cin >> m;
for(int i = ; i <= m; i ++)
{
scanf("%d%s%d%s", &d1[i], tem1, &d2[i], tem2);
c1[i] = tem1[] - 'A', c2[i] = tem2[] - 'A';
}
dfs();
if(!flag) printf("-1\n");
return ;
}
【题解】NOI2017游戏的更多相关文章
- 【BZOJ4945】[Noi2017]游戏 2-SAT
[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...
- P3825 [NOI2017]游戏
题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...
- [Luogu P3825] [NOI2017] 游戏 (2-SAT)
[Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...
- BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...
- 题解 洛谷 P3825 【[NOI2017]游戏】
从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...
- 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 场游戏,每场游戏使用 ...
- [NOI2017]游戏
题目描述 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 题解 如果说没有x的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...
随机推荐
- sax技术解析xml下jaxp解析器详细代码
*解析xml的两种技术dom和sax dom:根据xml的层级结构在内存中分配一个树形结构,把xml标签,属性,文本封装成对象. sax方式:事件驱动,边读边解析. 在javax.xml.parser ...
- js判断两个日期是否在几个月之内
//比较两个时间 time1,time2均为日期类型 //判断两个时间段是否相差 m 个月 function completeDate(time1 , time2 , m) { var diffyea ...
- python中的"is"与"=="比较
在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过: ...
- Cython中def,cdef,cpdef的区别
这是我的第一篇翻译,希望大家多多给出意见和建议. 如有转载,请注明出处. 原文来自:https://stackoverflow.com/questions/28362009/definition-of ...
- C语言Windows程序开发—CreateWindow函数介绍【第03天】
(一)CreateWindow函数的参数介绍: HWND CreateWindow( LPCTSTR lpClassName, //Windows窗口中预定义的控件结构体,包括:BUTTON(按钮), ...
- C# 实现程序开机自启动
最近在做一个自动备份文件的小工具,需要用到开机自启动 下面是代码 private void checkBox8_CheckedChanged(object sender, EventArgs e) { ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- C# 面试题 (一)
一.C# 理论 1.1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 private : 私有成员, 在类 ...
- ansible结合SHELL搭建自己的CD持续交付系统
一. 设计出发点 因公司业务面临频繁的迭代上线,一日数次.仅仅依靠手工效率过低且易出错. 考虑搭建一套可以满足现有场景的上线系统. 二 .为何采用ansible+shell方式 1.可控性(完全自主拥 ...
- 开启一个项目如何上传到git
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...