P3825 [NOI2017]游戏

题目描述

小 L 计划进行n场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏。

小 L 的赛车有三辆,分别用大写字母ABC表示。地图一共有四种,分别用小写字母xabc表示。其中,赛车A不适合在地图a上使用,赛车B不适合在地图b上使用,赛车C不适合在地图c上使用,而地图x则适合所有赛车参加。适合所有赛车参加的地图并不多见,最多只会有d张。

n场游戏的地图可以用一个小写字母组成的字符串描述。例如:S=xaabxcbc 表示小 L 计划进行8场游戏,其中第1场和第5场的地图类型是x,适合所有赛车,第2场和第3场的地图是a,不适合赛车A,第44场和第77场的地图是b,不适合赛车B,第6场和第88场的地图是c,不适合赛车C

小 L 对游戏有一些特殊的要求,这些要求可以用四元组    来描述,表示若在第ii场使用型号为   的车子,则第j场游戏要使用型号为   的车子。

你能帮小 L 选择每场游戏使用的赛车吗?如果有多种方案,输出任意一种方案。如果无解,输出 “-1’’(不含双引号)。

输入格式

输入第一行包含两个非负整数n, d。

输入第二行为一个字符串S。n, d, S的含义见题目描述,其中S包含n个字符,且其中恰好d个为小写字母x。

输入第三行为一个正整数m,表示有m条用车规则。接下来m行,每行包含一个四元组    ,其中i, j为整数,,  为字符abc,含义见题目描述。

输出格式

输出一行。

若无解输出 “-1’’(不含双引号)。

若有解,则包含一个长度为n的仅包含大写字母ABC的字符串,表示小 L 在这n场游戏中如何安排赛车的使用。如果存在多组解,输出其中任意一组即可。

数据范围

Solution

感觉2-SAT的题都比较显然吧,只要是每组二选一的大多都可以2-SAT。

先从整体观察此题。题意是给每个位置从ABC三种字母中选择一个填入,某些位置只有两个选项,某些位置有三个选项(出现次数不多于8次),并给出m个条件,每个条件要求x位置为p字符,则y位置为q字符,给出任意方案。

我们发现当所有位置只有两种选项时,就是一道基础的2-SAT题了。

设刚开始给的关于赛道条件的字符串为st,把不选择表示为选择

对于一个条件

  • 若st[x]=p,那么不会产生任何影响
  • 若st[x]!=p,且st[y]=q,那么我们倘若选择了p,则y位置为q,必然不合法,所以我们连一条的边。
  • 若st[x]!=p,且st[y]!=q,那么我们选择了p,相当于选择了q,所以连的边和的边。

直接tarjan,输出方案即可。(不会输出方案可以看 P4782 【模板】2-SAT 问题 的题解)

而现在某些位置有三个选项,但出现次数少于8,所以我们直接暴力枚举这些位置选择A还是B,每一次都做一遍上述的2-SAT过程即可。(感觉这题出在NOI2017简直送分)

时间复杂度为O(怎么样都能过)。

空间复杂度为O(怎么开都可以)。

Code(这个编辑器怎么把我的缩进安排了啊):

​
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+50;
const char C[3][2]={{'B','C'},{'A','C'},{'A','B'}};
const int c[3][2]={{1,2},{0,2},{0,1}};  //用这两个数组可以方便地判断谁是这个位置的第一种方式char st[MAXN];
bool ins[MAXN];
int DFN,colornum,n,m,d;
int dfn[MAXN],low[MAXN],color[MAXN];
int flag[MAXN],id[MAXN],chx[MAXN],chy[MAXN],X[MAXN],Y[MAXN];
vector<int> e[MAXN];
stack<int> stacks;
void add_edge(int u,int v)
{ e[u].push_back(v); //cout<<u<<" "<<v<<endl;
}
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
inline char get_ch()
{char c=getchar();while (c<'A'||c>'Z') c=getchar();return c;
}
void tarjan_init()
{DFN=0; colornum=0;memset(dfn,0,sizeof dfn);memset(low,0,sizeof low);memset(color,0,sizeof color);
}
void tarjan(int x)
{stacks.push(x);ins[x]=1;low[x]=dfn[x]=++DFN;for (int i=0;i<e[x].size();i++){int to=e[x][i];if (!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if (ins[to]) low[x]=min(low[x],dfn[to]);}if (low[x]==dfn[x]){color[x]=++colornum;ins[x]=0;while (stacks.top()!=x){ins[stacks.top()]=0;color[stacks.top()]=colornum;stacks.pop();}stacks.pop();}
}
void make_graph()                                         //分类讨论,构图
{for (int j=1;j<=n*2;j++) e[j].clear();for (int j=1;j<=m;j++) {//cout<<j<<":"<<endl;if (flag[X[j]]==chx[j]) continue;                        if (flag[Y[j]]==chy[j])                         {if (chx[j]==c[flag[X[j]]][0]) add_edge(X[j],X[j]+n);else add_edge(X[j]+n,X[j]);//add_edge(X[j]+n,X[j]);add_edge(X[j],X[j]+n);}else {if (chx[j]==c[flag[X[j]]][0]) {if (chy[j]==c[flag[Y[j]]][0]) add_edge(X[j],Y[j]),add_edge(Y[j]+n,X[j]+n);else add_edge(X[j],Y[j]+n),add_edge(Y[j],X[j]+n);}else {if (chy[j]==c[flag[Y[j]]][0]) add_edge(X[j]+n,Y[j]),add_edge(Y[j]+n,X[j]); else add_edge(X[j]+n,Y[j]+n),add_edge(Y[j],X[j]);}}}
}
bool check()                              //判断是否无解
{for (int j=1;j<=n;j++) if (color[j]==color[j+n]) return 0;return 1;
}
int main()
{n=read(),d=read();scanf("%s",st+1);int xnum=0;for (int i=1;i<=n;i++){if (st[i]=='x') id[++xnum]=i;else flag[i]=st[i]-'a';}m=read();for (int i=1;i<=m;i++){X[i]=read(); chx[i]=get_ch()-'A'; Y[i]=read(); chy[i]=get_ch()-'A';}for (int i=0;i<(1<<d);i++){for (int j=0;j<d;j++) flag[id[j+1]]=((i>>j)&1);make_graph();tarjan_init();for (int j=1;j<=(n<<1);j++)  if (!dfn[j]) tarjan(j);//cout<<endl; for (int j=1;j<=(n<<1);j++) cout<<j<<" "<<dfn[j]<<" "<<low[j]<<" "<<color[j]<<endl;if (!check()) continue;for (int j=1;j<=n;j++) putchar((color[j]<color[j+n])?C[flag[j]][0]:C[flag[j]][1]);                        //输出方案return 0;  }puts("-1");return 0;}
/*
3 3
axb
5
1 A 3 B
1 B 2 A
1 C 2 C
2 A 3 B
2 B 3 B
*/​

P3825 [NOI2017]游戏相关推荐

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

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

  2. bzoj 4945: [Noi2017]游戏

    Description Solution 首先我们发现一个位置如果不是 \('x'\),那么就只有两种选择 而 \('x'\) 的个数小于等于 \(8\),直接枚举是哪个就好了 然后就是 \(2-sa ...

  3. 暑假训练-义乌(7.8-7.15)

    暑假训练 模拟赛 图表 数据 7.8(lxl) 7.9(lxl) 7.10(lxl) 7.11(lxl) 7.12(wls) 7.13(wls) 7.14(wls) 7.15(lfds) 训练 数据结 ...

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

    P4782 [模板]2-SAT 问题 题意 题目背景 \(2-SAT\)问题模板 题目描述 有\(n\)个布尔变量\(x_1\sim x_n\),另有\(m\)个需要满足的条件,每个条件的形式都是&q ...

  5. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  6. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  7. NOI2010~NOI2018选做

    [NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. ...

  8. 2-SAT问题的一种解法(简明易懂)

    2-sat即2元约束问题 下面不加证明地描述一种较优的解法: 为每个需要被判定的量建立true.false两个节点,方便起见称它们为互斥节点. 将约束条件抽象为代表推导关系的有向边. tarjan缩点 ...

  9. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

最新文章

  1. bootstrap -- css -- 表格
  2. Java互联网架构 百度云_java互联网架构师
  3. 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜像,即拉即用——daocloud国内镜像加速...
  4. 我对于全栈工程师的理解
  5. Opencv--从CalibrateCamera到SolvePnp(二)
  6. 消除ie上的:为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件...
  7. urb传输的代码分析【转】
  8. PHP 将二维数组转成一维数组
  9. No package ‘gtksourceview-4‘ found
  10. MySQL安装配置教程(超级详细、保姆级)
  11. php发送exmail邮箱,php引入PHPMailer发送邮件
  12. NKOI 2008 涂色
  13. 蜀山前传之二---------------第八回
  14. 阿里、字节跳动再度发力游戏,腾讯、网易怕了吗?
  15. Windows server 2019 安装VPN
  16. 搜狗输入法的符号大全里面可以输入下标
  17. Win10清理鼠标右键新建菜单
  18. 忍不住推荐一款作图工具draw.io
  19. Arcgis: 利用xls文件绘制地图+细节参数调整(新手小白一看就懂)
  20. iOS中使用storyboard进行布局

热门文章

  1. 这8个中国天文台你肯定不认识!
  2. 天冷打字全靠抖?!桌面暖手宝,体验10s速热,温暖升级,冬天有TA就够了
  3. 史上最低估自己的天才科学家!预言自己的发现无用,没想到影响全世界,可他却在37岁..........
  4. 薅羊毛丨5个平价好物,终于终于终于打折了!
  5. 有图有真相!这世界上,竟有人跟你长得一模一样!
  6. 你试过不用if撸代码吗?
  7. 如何通过自学找到一份开发的工作?
  8. python 线程 的类库_python类库32[多线程]
  9. 显卡mx150和230哪个好_建模渲染用专业图形显卡和游戏显卡哪个更好?
  10. python量化常用_Python量化常用函数