BZOJ4945 NOI2017 游戏 - 2-SAT

这题放在NOI里应该不算难的吧……但是细节比较多,所以写起来会有点**

题目限定了道路不能通行某种车辆,也就是可以通行两种车辆

我们将这两种车辆分别作为正点和反点进行约束就可以了

建图较为容易

最后将所有的x枚举一下即可

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <vector>
  6 #include <cstdlib>
  7
  8 using namespace std;
  9
 10 vector <int> g[100005];
 11 vector <int> sta;
 12 vector <int> pos;
 13 int compcnt = 0;
 14 vector <int> comp[100005];
 15
 16 int dfn[100005], low[100005], is[100005], ic[100005], idx, cnt, n, m, indeg[100005], ans;
 17
 18 int seq[100005], lim[100005][5], d;
 19
 20 char str[100005];
 21
 22 void tarjan(int u) {
 23     is[u] = 2;
 24     low[u] = dfn[u] = ++idx;
 25     sta.push_back(u);
 26     for (int i = 0; i < g[u].size(); i++) {
 27         if (is[g[u][i]] == 0) {
 28             tarjan(g[u][i]);
 29             low[u] = min(low[u], low[g[u][i]]);
 30         }
 31         else {
 32             if (is[g[u][i]] == 2) {
 33                 low[u] = min(low[u], dfn[g[u][i]]);
 34             }
 35         }
 36     }
 37     if (low[u] == dfn[u]) {
 38         ++cnt;
 39         for (int j = 0; j != u;) {
 40             j = sta[sta.size() - 1];
 41             sta.pop_back();
 42             is[j] = 1;
 43             ic[j] = cnt;
 44             comp[cnt].push_back(j);
 45         }
 46     }
 47 }
 48
 49 bool check() {
 50     for(int i=2;i<=2*n+2;i+=2) {
 51         if(ic[i]==ic[i-1]&&ic[i]) {
 52             return false;
 53         }
 54     }
 55     return true;
 56 }
 57
 58 inline void link(int p,int q){
 59
 60     g[p].push_back(q);
 61 }
 62
 63 int frow(int typ,int key){
 64     if(typ==1) return key==2;
 65     if(typ==2) return key==1;
 66     if(typ==3) return key==1;
 67 }
 68
 69 int main()
 70 {
 71     scanf("%d%d",&n,&d);
 72
 73     scanf("%s",&str);
 74
 75     for (int i=1;i<=n;i++) seq[i]=(str[i-1]==‘x‘?0:(str[i-1]-‘a‘+1));
 76     for (int i=1;i<=n;i++) if(seq[i]==0) pos.push_back(i);
 77
 78     scanf("%d", &m);
 79
 80     char c1[2],c2[2];
 81
 82     for (int i=1;i<=m;i++) {
 83         scanf("%d%s%d%s",&lim[i][0],&c1,&lim[i][2],&c2);
 84         lim[i][1]=c1[0]-‘A‘+1;
 85         lim[i][3]=c2[0]-‘A‘+1;
 86
 87     }
 88
 89     for (int pix=0;pix<1<<d;pix++) {
 90         memset(dfn,0,sizeof dfn); memset(low,0,sizeof low); memset(is,0,sizeof is); memset(ic,0,sizeof ic);
 91         sta.clear();
 92         for(int i=1;i<=cnt;i++) comp[i].clear();
 93         idx=0; cnt=0;
 94
 95         int tmp = pix;
 96
 97         for (int i=0;i<2*n+2;i++) g[i].clear();
 98
 99         for (int j=pos.size()-1;j>=0;j--) {
100             seq[pos[j]]=tmp%2 + 1;
101             tmp/=2;
102         }
103
104         for (int i=1;i<=m;i++) {
105             if (lim[i][1]==seq[lim[i][0]]) continue;
106             if (lim[i][3]==seq[lim[i][2]]) link(2*lim[i][0]-frow(seq[lim[i][0]],lim[i][1]),2*lim[i][0]-1+frow(seq[lim[i][0]],lim[i][1]));
107             else link(2*lim[i][0]-frow(seq[lim[i][0]],lim[i][1])
108                      ,2*lim[i][2]-frow(seq[lim[i][2]],lim[i][3])),
109                       link(2*lim[i][2]-1+frow(seq[lim[i][2]],lim[i][3]),
110                            2*lim[i][0]-1+frow(seq[lim[i][0]],lim[i][1]));
111
112         }
113         for (int i = 1; i <= 2*n; i++) {
114             if (dfn[i] == 0)
115                 tarjan(i);
116         }
117
118         if(!check()) continue;
119         for (int i=1;i<=2*n;i+=2) {
120             if(ic[i]<ic[i+1])
121                 printf("%c",‘A‘-‘a‘+(seq[i/2+1]==1?‘b‘:‘a‘));
122             else printf("%c",‘A‘-‘a‘+(seq[i/2+1]==3?‘b‘:‘c‘));
123         }
124         printf("\n");
125         return 0;
126     }
127     printf("-1\n");
128
129     return 0;
130 }

原文地址:https://www.cnblogs.com/mollnn/p/8447379.html

时间: 2024-10-21 22:15:02

BZOJ4945 NOI2017 游戏 - 2-SAT的相关文章

【BZOJ4945】[Noi2017]游戏 2-SAT

[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么不是B,所以直接2^8枚举所有x就行了.然后就变成了一个2-SAT问题.假设有两场游戏1,2,分别可以使用的地图为A1,A2,B1,B2,如果有一个限制是1 A 2 A,那么选A1就必须选A2,然后我这个沙茶就开开心心的拿了55分. 为什么不对?我建出来的图显然不对偶啊!考虑逆否命题,选A1就必须选

【uoj#317】[NOI2017]游戏 2-SAT

题目描述 给出 $n$ 个赛车赛道和A.B.C三种赛车,除了 $d$ 个赛道可以使用所有三种赛车以外每个都只能使用给出的两种之一.另外给出 $m$ 条限制:某个赛道使用X则某另一个赛道必须使用Y.问:是否存在一种方案满足所有条件?输出一种合法方案. $n]le 50000,d\le 8,m\le 100000$ . 题解 2-SAT 3-SAT是NP完全问题,由于 $d$ 只有 $8$ ,因此考虑枚举每个万能位置的取值,转化为2-SAT问题. 那么对于一条限制,显然描述对应着一条边:另外一个命题

【题解】NOI2017游戏

2-SAT.洛谷P3845 一开始以为--怎么有3个呢?后来发现因为每个地图都有一种车是不能用的,所以就等于每一个地图都有两个适应的车啦. 那么对于x类型的地图呢--只有8个,直接2^8暴力枚举每一种可能,就转化为了普通的问题. 令u,u'分别为一个地图适应的两种车,那么对于一个要求h1 - d1, h2 - d2而言,如果第一个既不是u,也不是u',说明可以无视:如果第二个都不能满足, 就连d1 - d1',表示如果必须选第一辆,问题无解.其余情况则d1-d2,d2'-d1'(重要!保证图的对

[NOI2017]游戏

Sol 然而我的代码在\(UOJ\)上被\(hack\)\(\ TLE\)了 但思路是没问题的\(TAT\) 如果没有\(x\),就是个\(2-SAT\) 我们爆搜\(x\)的地图是\(a\)还是\(b\)就好了 不用枚举它是\(c\),枚举\(a\),\(b\)就能保证正好选\(ABC\)三种车 我也不知道我的输出方案哪里学的 拓扑排序+染色\(QAQ\) 如果觉得自己的代码优秀就去\(UOJ\)上交吧(逃 # include <bits/stdc++.h> # define RG regi

loj2305 noi2017 游戏

题目链接 思路 既然\(x\)的数量那么小,我们就可以先把每个\(x\)搜索一遍. 枚举x的时候不需要把\(a,b,c\)全枚举一遍,只要枚举其中的两个就可以枚举到当前位置选任何车的情况. 然后就变成了只有\('a','b','c'\)的序列.寻找满足题目要求的方案. \(2-sat\)模型. 连边的时候注意一些技巧,否则\(if\)写到自闭.. 在\(UOJ\)上会被卡掉\(3\)分.实在懒得去卡常了233 代码 /* * @Author: wxyww * @Date: 2019-04-29

Luogu P4782 【模板】2-SAT 问题(2-SAT)

P4782 [模板]2-SAT 问题 题意 题目背景 \(2-SAT\)问题模板 题目描述 有\(n\)个布尔变量\(x_1\sim x_n\),另有\(m\)个需要满足的条件,每个条件的形式都是"\(x_i\)为\(true/false\)或\(x_j\)为\(true/false\)".比如"\(x_1\)为真或\(x_3\)为假"."\(x_7\)为假或\(x_2\)为假".\(2-SAT\)问题的目标是给每个变量赋值使得所有条件得到满足.

【NOI2017】游戏 2-sat算法

[题目]LibreOJ [题意]n场游戏,有三种车ABC,给定长度为n的字符串,'a'表示不能选A,'b''c'同理,'x'表示不限,至多d个'x'.有m个限制(i,hi,j,hj)表示如果第i场选择车hi,那么第j场必须选择车hj.求可行方案,或无解.n<=10^5,d<=8. [算法]2-sat [题解] 原文地址:https://www.cnblogs.com/onioncyc/p/8605676.html

漫谈游戏中的人工智能

写在前面   今天我们来谈一下游戏中的人工智能.当然,内容可能不仅仅限于游戏人工智能,还会扩展一些其他的话题. 游戏中的人工智能,其实还是算是游戏开发中有点挑战性的模块,说简单点呢,是状态机,说复杂点呢,是可以帮你打开新世界大门的一把钥匙.有时候看到知乎上一些可能还是前公司同事的同学的一些话,感觉还是挺哭笑不得的,比如这篇:http://zhi.hu/qu1h,吹捧机器学习这种玄学,对游戏开发嗤之以鼻.我只能说,技术不到家.Vision不够,这些想通过换工作可培养不来. 这篇文章其实我挺早就想写

【分享】VNR翻译日语游戏汉化简易图解教材

请[点击图片]到新链接看[原图].不然博客自动缩小图,看不清图解. 上面是用美少女万花镜来测试新版VNR翻译的如何,结果比我预料还要好.以前旧版根本比不上新版的.翻译非常准确.看了我上面的简易VNR图解,应该了解了怎样翻译了吧.接下来就是D.C.III.RX翻译. 来看下翻译效果吧. 最新版文本设置,其它还都是一样. D.C.III RX在VNR下全屏化 如果出现部分打开GAL游戏VNR却不自动弹出翻译窗口和翻译不出文本,请看下面解决方法. 提取文本后无法翻译或翻译不完整,不通顺解决方法 D.C