题目

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]游戏的更多相关文章

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

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  2. Luogu P3825 [NOI2017]游戏

    这道题看上去NPC啊,超级不可做的样子. 我们先分析一下简单的情形:没有\(x\)地图 此时每个地图由于限制掉一种汽车,那么显然只会有两种选择. 再考虑到限制的情况,那么大致做法就很显然了--2-SA ...

  3. 洛谷P3825 [NOI2017]游戏(2-SAT)

    传送门 果然图论的题永远建图最麻烦……看着题解代码的建图过程真的很珂怕…… 先不考虑地图$x$,那么每一个地图都只能用两种赛车,于是我们可以用2-SAT来搞,用$i$表示这个地图能用的第一辆车,$i' ...

  4. 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】

    UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...

  5. 并不对劲的bzoj4945:loj2305:uoj317:p3825[NOI2017]游戏

    题目大意 2-SAT,其中有\(d\)(\(d\leq 8\))个点是\(3-SAT\). 题解 枚举\(d\)个点不取三个中(假设三个为\(a,b,c\))的哪一个,然后整体变成做\(2-SAT\) ...

  6. 【BZOJ4945】[Noi2017]游戏 2-SAT

    [BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...

  7. 题解 洛谷 P3825 【[NOI2017]游戏】

    从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...

  8. bzoj3825 NOI2017 游戏

    题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...

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

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

随机推荐

  1. Node Embedding

    1.Kipf, Thomas N., and Max Welling. "Semi-supervised classification with graph convolutional ne ...

  2. Servlet 自动刷新页面

    假设有一个网页,它是显示现场比赛成绩或股票市场状况或货币兑换率.对于所有这些类型的页面,您需要定期刷新网页. Java Servlet 提供了一个机制,使得网页会在给定的时间间隔自动刷新. 刷新网页的 ...

  3. Struts2 结果和结果类型

    正如前面提到的,<results>标签在Struts2的MVC框架的视图中所扮演的角色.动作是负责执行业务逻辑.执行业务逻辑后,接下来的步骤是使用<results>标签显示的视 ...

  4. python 自动化之路 day 18 前端内容回顾、补充/Django安装、创建

    前端回顾: 整体: - HTML - CSS - JavaScript - 基本数据类型 - for,while.. - DOM - obj = document.getElementById('.. ...

  5. Linq to SQL 语法查询(子查询 & in操作 & join )

    var 子查询 = from c in ctx.Customers                    where                        (from o in ctx.Ord ...

  6. UIAlertView及UIActionSheet 在ios8极其以下版本的兼容问题解决方案

    本文转载至 http://www.aichengxu.com/view/35326 UIAlertView及UIActionSheet在ios8中被放弃,其功能将完全由UIAlertControlle ...

  7. 回溯法——最大团问题(Maximum Clique Problem, MCP)

    概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...

  8. [Docker]学习笔记--简单介绍

    学习docker已经有一段时间了,一直没有静下心来好好总结一下. 最近用docker搭了一整套Gitlab的持续集成环境.(会在下一篇中详细的讲解具体步骤,敬请期待) 感觉是时候写点东西和大家一起分享 ...

  9. 【BZOJ2506】calc 分段+vector+莫队

    [BZOJ2506]calc Description          给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且A ...

  10. 巨蟒python全栈开发flask目录

    预习1: 1.FlaskWeb框架: https://www.cnblogs.com/DragonFire/category/1246076.html 人工智能技术应用: https://www.cn ...