「NOI2017」游戏 解题报告
「NOI2017」游戏
\(d\)这么小,你考虑直接对\(d\)个东西暴力
枚举\(x\)为\(a\)或\(b\)(\(c\)就不用了,因为\(a,b\)已经包含\(c\))了,剩下的就是个\(2-sat\)问题了
但是你发现有个情况是,在若\(A\)即\(B\)时,如果\(B\)被\(ban\)了,那么\(A\)也要被\(ban\)
我们记录一下被\(ban\)的点,然后在球方案的时候判一下(不得不用topo排序了..
但是其实也可以\(A\)连\(\lnot A\),就可以直接比较SCC编号大小搞方案了
Code:
#include <cstdio>
#include <cctype>
#include <cstring>
#include <vector>
#include <algorithm>
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
template <class T>
void reads(T &x)
{
char c=gc();
while(c<'a'||c>'z') c=gc();
x=c-'a'+1;
}
template <class T>
void readb(T &x)
{
char c=gc();
while(c<'A'||c>'Z') c=gc();
x=c-'A'+1;
}
const int N=2e5+10;
int head[N],to[N],Next[N],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
struct _toki
{
int a,b,c,d;
}toki[N];
int n,m,_n,yuu[N][4],ops[N],saki[N];
int val[N],ban[N],Ban[N],q[N],bel[N],opsi[N];
int low[N],dfn[N],in[N],sta[N],tot,dfsclock;
std::vector <int> E[N];
void tarjan(int now)
{
dfn[now]=low[now]=++dfsclock;
in[sta[++tot]=now]=1;
for(int v,i=head[now];i;i=Next[i])
{
if(!dfn[v=to[i]])
{
tarjan(v);
low[now]=min(low[now],low[v]);
}
else if(in[v])
low[now]=min(low[now],dfn[v]);
}
if(low[now]==dfn[now])
{
int k;++_n;
do
{
k=sta[tot--];
in[k]=0;
bel[k]=_n;
}while(now!=k);
}
}
int solve()
{
memset(head,0,sizeof head);cnt=0;
memset(ban,0,sizeof ban);
memset(Ban,0,sizeof Ban);
for(int a,b,c,d,i=1;i<=m;i++)
{
a=toki[i].a,b=toki[i].b,c=toki[i].c,d=toki[i].d;
if(saki[a]==b) continue;
if(saki[c]==d)
{
ban[yuu[a][b]]=1;
continue;
}
add(yuu[a][b],yuu[c][d]);
add(ops[yuu[c][d]],ops[yuu[a][b]]);
}
memset(in,0,sizeof in);
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
memset(bel,0,sizeof bel);
memset(opsi,0,sizeof opsi);
_n=dfsclock=0;
for(int i=1;i<=n<<1;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
if(bel[i]==bel[i+n])
return -1;
memset(val,-1,sizeof val);
for(int i=1;i<=_n;i++) E[i].clear();
//int ecnt=0;
for(int u=1;u<=n<<1;u++)
{
for(int v,i=head[u];i;i=Next[i])
if(bel[u]!=bel[v=to[i]])
E[bel[v]].push_back(bel[u]),++in[bel[u]];//++ecnt;
Ban[bel[u]]|=ban[u];
opsi[bel[u]]=bel[ops[u]];
}
int l=1,r=0;
for(int i=1;i<=_n;i++)
if(!in[i]&&!Ban[i])
q[++r]=i;
while(l<=r)
{
int now=q[l++];
if(val[now]==-1) val[now]=0,val[opsi[now]]=1;
for(int v,i=0;i<E[now].size();i++)
{
v=E[now][i];
--in[v];
if(!in[v]&&!Ban[v]) q[++r]=v;
}
}
for(int i=1;i<=n;i++)
if(val[bel[i]]==-1)
return -1;
for(int i=1;i<=n;i++)
{
int x=val[bel[i]];
for(int j=1;j<=3;j++)
{
if(saki[i]!=j)
{
if(!x) putchar('A'+j-1);
--x;
}
}
//puts("");
}
return 0;
}
int main()
{
//freopen("game.in","r",stdin);
//freopen("game.out","w",stdout);
int d,yuy[10];
read(n),read(d);
d=0;
for(int i=1;i<=n;i++)
{
ops[i]=i+n;
ops[i+n]=i;
reads(saki[i]);
if(saki[i]==24)
{
yuy[++d]=i;
continue;
}
int aya=i;
for(int j=1;j<=3;j++)
{
if(saki[i]!=j)
{
yuu[i][j]=aya;
aya+=n;
}
}
}
read(m);
for(int i=1;i<=m;i++) read(toki[i].a),readb(toki[i].b),read(toki[i].c),readb(toki[i].d);
if(!d)
{
if(solve()==-1) puts("-1");
return 0;
}
for(int s=0;s<1<<d;s++)
{
for(int i=1;i<=d;i++)
{
if(!(s>>i-1&1))
{
saki[yuy[i]]=1;
yuu[yuy[i]][2]=yuy[i];
yuu[yuy[i]][3]=yuy[i]+n;
}
else
{
yuu[yuy[i]][1]=yuy[i];
saki[yuy[i]]=2;
yuu[yuy[i]][3]=yuy[i]+n;
}
}
if(~solve()) return 0;
}
puts("-1");
return 0;
}
2019.6.2
「NOI2017」游戏 解题报告的更多相关文章
- 「NOI2017」蔬菜 解题报告
「NOI2017」蔬菜 首先考虑流 可以从 \(s\) 流入表示得到蔬菜,流出到 \(t\) 表示卖出蔬菜,给每个蔬菜拆点,并给它它每天应得的蔬菜. 但是我们没办法直接给,注意到如果把变质看成得到并可 ...
- 「NOI2017」整数 解题报告
「NOI2017」整数 有一些比较简单的\(\log^2n\)做法 比如暴力在动态开点线段树上维护每个位置为\(0\)还是\(1\),我们发现涉及到某一位加上\(1\)或者减去\(1\)实际上对其他位 ...
- 「NOI2017」游戏
「NOI2017」游戏 题目描述 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 \(A\).\(B\).\ ...
- LOJ_2305_「NOI2017」游戏 _2-sat
LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...
- loj #2305. 「NOI2017」游戏
#2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...
- LOJ2305 「NOI2017」游戏
「NOI2017」游戏 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行$n$场 ...
- 「ZJOI2016」旅行者 解题报告
「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...
- 「HNOI2016」树 解题报告
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...
- 「HNOI2016」序列 解题报告
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...
随机推荐
- PHP curl_escape函数
curl_escape — 对给定的字符串进行URL编码. 说明 string curl_escape ( resource $ch , string $str ) 该函数对给定的字符串进行URL编码 ...
- vue.js使用echarts一分钟简单入门
图表的使用在企业级软件中使用越来越普遍,前端开发人员可以使用常用的echarts开源库来进行图表展示的开发,公司最近提出需要丰富系统首页的内容,趁此机会分享一下如何在使用vue.js框架下使用echa ...
- php使用curl实现get和post请求的方法,数据传输urldecode和json
PHP支持CURL库,利用URL语法规定来传输文件和数据的工具,支持很多协议,包括HTTP.FTP.TELNET等. 优点:是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS.CURL ...
- error C2065: “SHELLEXECUTEINFO”: 未声明的标识符
转自VC错误:http://www.vcerror.com/?p=1385 问题描述: error C2065: "SHELLEXECUTEINFO": 未声明的标识符 解决方法: ...
- error C2872: ‘ofstream’ : ambiguous symbol
转自VC错误:http://www.vcerror.com/?p=1123 问题描述: 编译时出现: error C2872: 'ofstream' : ambiguous symbol error ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...
- PHP 算式验证码
这里不多说,直接上代码! /** * 改造的加减法验证类 * 使用示例 VerifyCode::get('xxx', 20); * 验证示例 VerifyCode::check('1', 'xxx') ...
- Python面试题之如何用Python来发送邮件?
python实现发送和接收邮件功能主要用到poplib和smtplib模块. poplib用于接收邮件,而smtplib负责发送邮件. 代码如下: 1 #! /usr/bin/env python 2 ...
- springboot 项目启动脚本
springboot项目启动可通过下面的shell脚本启动. startup.sh app=order-service-rest.jar appout=logs/${app/.jar/.out} ap ...
- C#冒泡排序法学习
一,冒泡排序法理解:就是将一个集合里的数据当前位置和后一位比较,然当前位置大于后一位,则两个位置替换,直到排序完成 using System; using System.Collections.Gen ...