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 ...
随机推荐
- 从golang的垃圾回收说起(上篇)
本文来自网易云社区 1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic me ...
- UpdateLog
2014-10-20 增加数据适配器,使支持多数据库类型2015-01-08 增加没有主键ID的抽象类,使能自义主键字段实现MODEL 增加虚拟字段转换,将指定函数或语法转换为对象属性,灵活性更大了 ...
- Selenium(Python)调用pywin32上传图片
import unittestfrom time import sleep import osfrom selenium import webdriverimport win32apiimport w ...
- Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...
- 【WXS全局对象】Global
Global对象的方法调用时,无需使用 Global.parseInt(...),而是直接使用 parseInt(...) 方法: 名称 说明 parseInt(string, radix) 解析一个 ...
- lintcode12 带最小值操作的栈
实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 建一个栈helpStack,用来存放从 ...
- 测试模拟 白屏 / FOUC
白屏和FOUC 白屏与无样式内容闪烁(FOUC)是因为不同浏览器加载与显示页面的机制不同而造成的. 我们可以通过一个实验来进行测试和模拟白屏.FOUC的现象,让我们更好的理解白屏.FOUC. 测试de ...
- yun rpm
RPM:RedHat Package Manager的简称,是一种数据库记录的方式的管理机制.当需要安装的软件的依赖软件都已经安装,则继续安装,否则不予安装. 特点:1.已经编译并打包完成2.软件的信 ...
- hadoop问题集(2)
28. Sqoop: java.lang.NullPointerException sqoop import --connect jdbc:oracle:thin:@//xxxx:1521/aps ...
- HADOOP (十一).安装hbase
下载安装包并解压设置hbase环境变量配置hbase-site.xml启动hbase检测hbase启动情况测试hbase shell 下载安装包并解压 https://mirrors.tuna.tsi ...