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. 【ssh服务配置】

    根据项目需求,搭建好拓扑图如下: 第一种验证方式:给予密码和用户名登录 Ssh server配置: 首先在服务器上创建一个rsa加密算法的秘钥对: 对ssh服务进行开启: 创建用户的虚拟终端登录界面: ...

  2. Asp.net 自定义CustomerSession 存放到Redis中

    首先,引用 Redis 操作驱动组件:StackExchange.Redis.dll. 继承SessionStateStoreProviderBase 类, 实现方法: using System; u ...

  3. QQ运动,新楛的马桶还在香,营销人不应摒弃。

    QQ运动,都说新楛的马桶还香三天,为毛你这般明日黄花,为营销人所弃. QQ运动,一个差不多被遗忘的冷却地带,却圈粉无数,以性感.狂野.妖艳.线条.汗水等秀元素贯穿始终,狼友显露于此,爱美的女性也未曾缺 ...

  4. Hive初识(四)

    Hive本质上是一个数据仓库,但不存储数据(只存储元数据(metadata),Hive中的元数据包括表的名字,表的列和分区及分区及其属性,表的属性(是否为外部表等),表的数据所在目录等),用户可以借助 ...

  5. git初始化仓库相关

    当我们需要新建一个git项目会遇到的问题 全局设置 git config --global user.name "名字" git config --global user.emai ...

  6. Linux使用imagemagick的convert命令压缩图片,节省服务器空间

    1,安装imagemagick yum install ImageMagick 2,获取图片 find ./ -regex '.*\(jpg\|JPG\|png\|jpeg\)' -size +500 ...

  7. 玩转Vim-札记(一)

    玩转Vim-札记(一) 简介 在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神.一些人勇敢地拾起了Vim或Emacs,却发现学习曲线陡峭而漫长,还是有一些人 ...

  8. 【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

    背景: 由于不可抗拒的原因,学习环境由之前centos的一台机器上,变成了ubuntu的一台机器上.因此,需要在新的ubuntu的机器上再配置一次vim环境.算起来这已经是第三次配置vim环境了(ma ...

  9. 关于C#数据类型自己的理解

    电脑CUP处理程序的运行.cpu里分为一级缓存,二级缓存,还有三级缓存,之后是内存里的东西. 栈存放在一级缓存里,所以cup调用速度最快,处理起来也效率也最高,但是大小很小,能存放的东西很少. 堆存放 ...

  10. svn 用cmd命令行启动服务

    部署好svn 服务器后,用cmd命令行 svnserve -d -r [仓库地址] 启动服务,这样别的用户可以通过网络访问svn服务器了.