P3825 [NOI2017]游戏
题目
做法
\(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\prime\)
难点在处理\(x\)地图上,三进制枚举车,状压一下也能做,理论时间复杂度\(O(3^d 4m)\),卡不满优化一下也能过吧
往更深层考虑??不枚举选哪个了,枚举选地图,其实只用考虑\(A,B\)就行,\(C\)包含在里面了(反正也只要选一辆)
时间复杂度\(O(2^d 4m)\)
My complete code
#include<bits/stdc++.h>
#include<stack>
using namespace std;
typedef int LL;
const LL maxn=1e6;
struct node{
LL to,next;
}dis[maxn];
stack<LL> sta;
LL num,n,m,k,tim,tot,d;
LL head[maxn],Scc[maxn],low[maxn],dfn[maxn],pos[maxn],x[maxn],y[maxn],visit[maxn];
char s[maxn],p1[maxn],p2[maxn];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]},head[u]=num;
}
void Tarjan(LL u){
visit[u]=1; sta.push(u); low[u]=dfn[u]=++tim;
for(LL i=head[u];i;i=dis[i].next){
LL v(dis[i].to);
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(visit[v]) low[u]=min(low[u],low[v]);
}
if(low[u]==dfn[u]){
LL now;
++tot;
do{
now=sta.top(); sta.pop();
Scc[now]=tot;
visit[now]=0;
}while(now!=u);
}
}
inline bool Check(){
for(LL i=1;i<=2*n;++i)
if(!dfn[i]) Tarjan(i);
for(LL i=1;i<=n;++i)
if(Scc[i]==Scc[i+n]) return false;
for(LL i=1;i<=n;++i){
if(Scc[i]<Scc[i+n]){
if(s[i]=='A') printf("B");
else printf("A");
}else{
if(s[i]=='C') printf("B");
else printf("C");
}
}return true;
}
inline void First(){
for(LL i=1;i<=2*n;++i) visit[i]=0;
for(LL i=1;i<=2*n;++i) low[i]=0;
for(LL i=1;i<=2*n;++i) dfn[i]=0;
for(LL i=1;i<=2*n;++i) Scc[i]=0;
for(LL i=1;i<=2*n;++i) head[i]=0;
while(sta.size()) sta.pop();
num=tim=tot=0;
}
inline void Solve(){
LL up((1<<d)-1),x1,x2,y1,y2;
for(LL i=0;i<=up;++i){
First();
for(LL j=1;j<=d;++j)
if(((i>>(j-1))&1)==0) s[pos[j]]='A';
else s[pos[j]]='B';
for(LL j=1;j<=m;++j){
if(p1[j]==s[x[j]]) continue;
if(p2[j]==s[y[j]]){
if(p1[j]=='C' || (p1[j]=='B' && s[x[j]]=='C'))
Add(x[j]+n, x[j]);
else
Add(x[j], x[j]+n);
continue;
}
if(p1[j]=='A' || (p1[j]=='B'&&s[x[j]]=='A')) x1=x[j],x2=x[j]+n;
else x1=x[j]+n,x2=x[j];
if(p2[j]=='A' || (p2[j]=='B'&&s[y[j]]=='A')) y1=y[j],y2=y[j]+n;
else y1=y[j]+n,y2=y[j];
Add(x1,y1);
Add(y2,x2);
}
if(Check()) return;
}
printf("-1");
}
int main(){
scanf("%d%d",&n,&d);
scanf(" %s",s+1);
LL cnt(0);
for(LL i=1;i<=n;++i)
if(s[i]=='x')
pos[++cnt]=i;
else
s[i]='A'+(s[i]-'a');
scanf("%d",&m);
for(LL i=1;i<=m;++i){
scanf("%d",x+i);
scanf(" %c",&p1[i]);
scanf("%d",y+i);
scanf(" %c",&p2[i]);
}
Solve();
return 0;
}
P3825 [NOI2017]游戏的更多相关文章
- [Luogu P3825] [NOI2017] 游戏 (2-SAT)
[Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...
- Luogu P3825 [NOI2017]游戏
这道题看上去NPC啊,超级不可做的样子. 我们先分析一下简单的情形:没有\(x\)地图 此时每个地图由于限制掉一种汽车,那么显然只会有两种选择. 再考虑到限制的情况,那么大致做法就很显然了--2-SA ...
- 洛谷P3825 [NOI2017]游戏(2-SAT)
传送门 果然图论的题永远建图最麻烦……看着题解代码的建图过程真的很珂怕…… 先不考虑地图$x$,那么每一个地图都只能用两种赛车,于是我们可以用2-SAT来搞,用$i$表示这个地图能用的第一辆车,$i' ...
- 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】
UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...
- 并不对劲的bzoj4945:loj2305:uoj317:p3825[NOI2017]游戏
题目大意 2-SAT,其中有\(d\)(\(d\leq 8\))个点是\(3-SAT\). 题解 枚举\(d\)个点不取三个中(假设三个为\(a,b,c\))的哪一个,然后整体变成做\(2-SAT\) ...
- 【BZOJ4945】[Noi2017]游戏 2-SAT
[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...
- 题解 洛谷 P3825 【[NOI2017]游戏】
从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...
- bzoj3825 NOI2017 游戏
题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...
- [NOI2017]游戏(2-SAT)
这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...
随机推荐
- mac与phy怎样实现网络自适应
这两天改动网卡驱动以实现10/100/1000M自适应,因此研究了下phy芯片和emac驱动怎样兼容10/100/1000M网络环境,记录在此. 网络中设备端数据链路层由mac芯片和phy芯片组成.p ...
- kafka 集群--3个broker 3个zookeeper创建实战
准备工作: 1. 准备3台机器,IP地址分别为:192.168.0.10,192.168.0.11,192.168.0.12 2. 下载kafka稳定版本,我的版本为:kafka_2.9.2-0.8. ...
- python3----连接字符串数组(join)
join 方法用于连接字符串数组 s = ['a', 'b', 'c', 'd'] print(''.join(s)) print('-'.join(s)) results: abcd a-b-c-d ...
- C++初级 入门笔记学习(一)
,C++Primer初级: 预处理(E查看)->编译(S查看)->连接 13_枚举:可以尽可能多用枚举,多个const变量,可以用枚举去做: string name("aaa&q ...
- nyoj677 谍战
本题能够说是最小割入门级题目. 假设能想到是最小割问题.那么建图思路便是水到渠成的事了. 加入一个源点S和汇点T: 把S与每一个间谍相连.容量为无穷大: 把城市N(即飞机场的位置)与汇点T相连.容量为 ...
- Android无线测试之—Genymotion配置过程中常见问题
一.前提条件: 已经部署好了Android UiAutomator测试环境. 二.在部署Genymotion时遇到了两类问题: 1.通过eclipse打开一个模拟设备,然后将编译好的jar包push到 ...
- js原型对象中属性被覆盖(1)
/** *@author 程无衣 *@description 关于在原型对象中属性被覆盖 */ function Person(){} Person.prototy ...
- 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
[BZOJ3994][SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组 ...
- 《从零开始学Swift》学习笔记(Day 37)——默认构造函数
原创文章,欢迎转载.转载请注明:关东升的博客 结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部 ...
- LR回放https协议脚本失败:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection reset by peer [MsgId:MERR-27780]
最近做一个负载均衡项目的性能测试,使用LR录制脚本协议为https协议,回放脚本时出现报错: [GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX& ...