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游戏的更多相关文章

  1. 【BZOJ4945】[Noi2017]游戏 2-SAT

    [BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...

  2. P3825 [NOI2017]游戏

    题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...

  3. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  4. BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...

  5. 题解 洛谷 P3825 【[NOI2017]游戏】

    从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...

  6. bzoj3825 NOI2017 游戏

    题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...

  7. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

  8. NOI2017 [NOI2017]游戏 【2-sat】

    题目 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用 ...

  9. [NOI2017]游戏

    题目描述 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 题解 如果说没有x的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...

随机推荐

  1. javascript--淘宝页面的放大镜效果

    放大镜效果需求: 鼠标放入原图中,会出现一个黄色的遮盖层和一个放大的图片,鼠标移动时候,遮盖层会跟着鼠标一起移动,同时放大的图片会跟着一起移动. 实现过程: 1.鼠标移入,遮盖层和大图片显示 2.鼠标 ...

  2. myEclipse 常用快捷键,工具等记录

    小的不才,从北大青鸟毕业,出来之后到第一家公司进行工作,当时认为自己很牛逼,很无敌,但是出来之后发现在学校里学的那些东西,在工作中,除了会写一点if...else之外,连循环都很少写. 然而有用的工具 ...

  3. ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)

    因项目没有PC站所以没有写电脑网站支付. Pay.php支付控制器 <?php // +----------------------------------------------------- ...

  4. phpstudy配置域名后apache无法启动

    1.设置域名后重启 apache停止了 检查步骤1.php路径不要有中文,phpstudy重新安装在无中文路径 2.检查80端口是否被占用,如果被占用可以停止该程序或者修改apache/nginx 端 ...

  5. 21.1 XMLHttpRequest 对象【JavaScript高级程序设计第三版】

    IE5 是第一款引入XHR 对象的浏览器.在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的.因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLH ...

  6. MySQL学习路线图

  7. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...

  8. 003---生成器 & 迭代器

    生成器 & 迭代器 列表生成式 现在有个需求,列表[1, 2, 3, 4, 5, 6, 7, 8, 9],将列表里的每个值加1. 二逼青年版 a = [1, 2, 3, 4, 5, 6, 7, ...

  9. urllib.request.urlretrieve()

    urllib模块提供的urlretrieve()函数.urlretrieve()方法直接将远程数据下载到本地. urlretrieve(url, filename=None, reporthook=N ...

  10. 台湾ML笔记--1.1什么时候适合使用ML

    适用情况: 1 exists some 'underlying pattern' to be learned --so 'performance measure' can be imporoved 例 ...