BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4945
https://www.luogu.org/problemnew/show/P3825
题目不粘了。
对于冲突关系很明显是2-SAT,但是注意是2-SAT(lz曾经天真的gg过),也就是说,我们没法处理x。
不用慌,我们完全可以O(3^d)枚举,然而常数很大过不去uoj的hack。
但是思考如果为A则只可以选b/c,B则只可以选a/c,所以选C的情况已经被前面讨论完了,故可以O(2^d)枚举。
另外加点常数优化,比如if语句写else之类的TAT浪费我30min的时间卡常。
#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e4+;
const int M=1e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
inline int getc(){
char ch;
while((ch=getchar())==' '||ch=='\n');
if(ch=='A'||ch=='a')return ;
if(ch=='B'||ch=='b')return ;
if(ch=='C'||ch=='c')return ;
return ;
}
struct data{
int x,l,y,r;
}p[M];
struct node{
int to,nxt;
}e[M<<];
int n,d,m,cnt,head[N<<],to[N<<],a[N],mp[];
int dfn[N<<],low[N<<],t,l;
bool inq[N<<];
stack<int>q;
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void tarjan(int u){
dfn[u]=low[u]=++t;
q.push(u);inq[u]=;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(inq[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
int v;l++;
do{
v=q.top();q.pop();
to[v]=l;inq[v]=;
}while(v!=u);
}
}
inline int g(int x){
if(x>=)x-=;
return x;
}
inline int f(int x){
if(x>n)return x-n;
return x+n;
}
inline int num(int x,int k){
if(k==g(a[x]+))return x;
return x+n;
}
inline void print(int x,int on){
int t;
if(!on)t=g(a[x]+);
else t=g(a[x]+);
if(t==)putchar('A');
else if(t==)putchar('B');
else putchar('C');
}
inline void init(){
cnt=t=l=;
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
}
void solve(){
init();
for(int i=;i<=m;i++){
int x=p[i].x,l=p[i].l,y=p[i].y,r=p[i].r;
if(a[x]==l)continue;
int u=num(x,l),v=num(y,r);
if(a[y]==r)add(u,f(u));
else{
add(u,v);add(f(v),f(u));
}
}
for(int i=;i<=*n;i++)
if(!dfn[i])tarjan(i);
for(int i=;i<=n;i++)
if(to[i]==to[i+n])return;
for(int i=;i<=n;i++){
if(to[i]<to[i+n])print(i,);
else print(i,);
}
puts("");exit();
}
void dfs(int now){
if(now==d+){
solve();return;
}
a[mp[now]]=;dfs(now+);
a[mp[now]]=;dfs(now+);
}
int main(){
n=read();read();
for(int i=;i<=n;i++){
a[i]=getc();
if(a[i]==)mp[++d]=i;
}
m=read();
for(int i=;i<=m;i++){
p[i].x=read(),p[i].l=getc();
p[i].y=read(),p[i].r=getc();
}
dfs();
puts("-1");
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +
+++++++++++++++++++++++++++++++++++++++++++
BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解的更多相关文章
- 题解 洛谷 P3825 【[NOI2017]游戏】
从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...
- 洛谷P1123取数游戏题解
题目 这是一道简单的搜索题,考查的还是比较基础的东西,其时搜索有时候并不难写,主要是要想到怎么搜.比如这个题,如果想二维四个方向搜则没有头绪,反之因为搜索是用递归实现的,所以我们可以使用递归的特性,把 ...
- BZOJ5323 & 洛谷4562:[JXOI2018]游戏——题解
https://www.luogu.org/problemnew/show/P4562 https://www.lydsy.com/JudgeOnline/problem.php?id=5323 (B ...
- 洛谷P1129 [ZJOI2007]矩阵游戏 题解
题目链接:https://www.luogu.org/problemnew/show/P1129 分析: 这道题不是很好想,但只要想的出来,代码不成问题. 思路1 举几个例子,我们发现, 对于任何数来 ...
- 洛谷P1640 [SCOI2010]连续攻击游戏 题解
题目链接: https://www.luogu.org/problemnew/show/P1640 分析: 这道题用二分图来解决即可.应该可以作为网络流中的模板题来食用, 每一个武器有两个属性,但是只 ...
- 洛谷P1488 肥猫的游戏 题解 博弈论入门
题目链接:https://www.luogu.org/problem/P1488 其实这道题目我只需要 \(n\) 以及黑色三角形的三个端点编号就可以了. 我们假设在一个 \(n\) 边形中,黑色三角 ...
- 洛谷3825 [NOI2017]游戏 2-sat
原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P1274-魔术数字游戏
Problem 洛谷P1274-魔术数字游戏 Accept: 118 Submit: 243Time Limit: 1000 mSec Memory Limit : 128MB Probl ...
随机推荐
- Android 模拟器下载、编译及调试
Android 模拟器源码下载 Android 模拟器源码的下载与 Android AOSP 源码库的下载过程类似,可以参考 Google 官方提供的 Android 源码下载文档 来了解这个过程. ...
- Hive实现自增列
1.用row_number()函数生成代理键 ) max_id from id_test) t2; 2.用UDFRowSequence生成代理键 ——报错? add jar ...
- eclipse导入jmeter3.1源码并运行
jmeter3.1源码地址:https://archive.apache.org/dist/jmeter/source/ 1.打开eclipse,新建一个java project的项目,并点击next ...
- 博客更换至 www.zhaoch.top
博客更换至 www.zhaoch.top 随手拷了一些链接 http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系 ...
- python基本数据类型——集合
集合 无序可变序列,集合中元素不允许重复,即每个元素都是唯一的 集合中的元素按照升序排列 # 创建集合 >>aset = set([0,2,4,5,7,2,3,5,9,0]) >&g ...
- js如何判断客户端是iOS还是Android等移动终端
判断原理:JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来 ...
- FPGA学习-VGA接口
一般FPGA开发板的VGA会向用户暴露两共五个种接口,第一种是时序信号,用于同步传输和显示:第二种是色彩信号,用于随着时序把色彩显示到显示器上 时序接口 行同步信号-用于指示一行内像素的显示 场同步信 ...
- py3.6+anaconda下安装opencv3
py3.6+anaconda下安装opencv3 首先声明-网上的方法大多数都是有毒的.也不知道给的什么鬼方法都不行. 我说下我的方法.去这个网站https://pypi.tuna.tsinghua. ...
- C struct中的位域 bitfield
C struct中的位域 bitfield 结构体的成员可以限制其位域,每个成员可以使用用比字节还小的取值范围,下面的结构体s1中,四个成员每个成员都是2bit的值(0~3),整个结构体占据的空间依然 ...
- Python3 Tkinter-Place
1.绝对坐标 from tkinter import * root=Tk() lb=Label(root,text='hello Place') lb.place(x=0,y=0,anchor=NW) ...