【题解】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的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...
随机推荐
- jsp传参 servlet接收中文乱码问题
在公司实习了8个月,一直都是做android和h5的,但是发现做程序连一点服务都不会该怎么办,所以最近开始学起了java,不知道是不是因为框架学多了,现在看起springmvc框架比以前看起来简单太多 ...
- flutter开发之配置环境以及一些问题的处理方案~
今天flutter1.0已经发布了,有没有一点小小的兴奋,为了纪念这个令人激动的日子,我决定发一篇flutter的基本环境搭建的教程送给大家:) 由于这是一篇关于flutter配置环境的教程, ...
- java简单web爬虫(网页图片)
java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ...
- Centos7安装FastDFS
离线安装包准备: 将相关的安装包上传到 /usr/local 目录,安装包下载 并解压到当前目录 1.安装 gcc yum install -y gcc gcc-c++ 2.安装 perl yum i ...
- 分分钟教你学习GIt
Git配置: $ git config --global user.name "awen" $ git config --global user.email "awen@ ...
- CacheManager源码分析
计算rdd的某个分区是从RDD的iterator()方法开始的,我们从这个方法进入 然后我们进入getOrCompute()方法中看看是如何进行读取数据或计算的 getOrElseUpdate()方方 ...
- (数据科学学习手札25)sklearn中的特征选择相关功能
一.简介 在现实的机器学习任务中,自变量往往数量众多,且类型可能由连续型(continuou)和离散型(discrete)混杂组成,因此出于节约计算成本.精简模型.增强模型的泛化性能等角度考虑,我们常 ...
- AVL重平衡细节——插入
话说这个系列鸽了好久,之前在准备语言考试,就没管博客了,现在暑假咱们继续上路! 每当我们进行一次插入之后,整棵AVL树的平衡性就有可能发生改变,为了控制整棵树的高度,我们需要通过一系列变换(重平衡)来 ...
- json格式转化
python: json.dumps() : dict转成str json.loads():str转成dict (去除字符串eva() ) JS: JSON.parse(text[, reviver ...
- 2844: albus就是要第一个出场
2844: albus就是要第一个出场 链接 分析: 和HDU3949差不多互逆,这里需要加上相同的数. 结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大 ...