BZOJ5288 & 洛谷4436 & LOJ2508:[HNOI/AHOI2018]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5288
https://www.luogu.org/problemnew/show/P4436
UPD:重温了一下发现代码只能用C++(NOI)才能过了,不知道原因,但也懒得重写了,反正是对的。
看洛谷题解里面清一色的暴力,连唯一正解也是用了奇技淫巧才过(当然本题解参考了那个题解)。
于是难受的我来简单说一下“正解”(如有错误请指出orz)。
先从暴力开始,对于每个点我们暴力找到其能够到达的最大的区间[l,r]。
一个优化:我们在加入新的点进入这个区间的时候,可以把该点的答案区间合并进区间内。
接下来是正解,首先是对于每个门i,如果钥匙在其左边则add(i+1,i),否则add(i,i+1),其中边的含义是从入点无法到达出点。
于是对这个图拓扑排序后可发现,点u的答案区间一定不包含比其排名大的点,则在暴力优化的帮助下,我们可以证明出需要我们暴力更新的次数只有O(n)次。
但是为什么又要按照那篇题解所说,“初始化序列倒着加会快”呢?
我把数据下载下来才发现一个坑。
对于不在拓扑图上的点,其更新后的答案区间可能会覆盖与它同级甚至比它排名小的点的答案区间,这样暴力优化就无用武之地,复杂度退化到O(n^2)。
所以我们必须缩点,才能保证算法的复杂度。
(话句话讲就是出题人都如此煞费苦心卡掉了复杂度不对的正解却让暴力AC了)
#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+;
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;
}
struct node{
int to,nxt;
}e[N];
struct data{
int x,y;
}d[N];
int n,m,p,head[N],cnt,id,to[N];
int key[N],l[N],r[N],deg[N];
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;++deg[v];
}
inline bool pan(int x,int y){
if(y<||y>id)return ;
if(x<y)--y;
return l[x]<=key[y]&&key[y]<=r[x];
}
queue<int>q;
void dfs(){
for(int i=;i<=id;++i)if(!deg[i])q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
bool flag=;
while(flag){
flag=;
while(pan(u,l[u]-))l[u]=l[l[u]-],flag=;
while(pan(u,r[u]+))r[u]=r[r[u]+],flag=;
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!(--deg[v]))q.push(v);
}
}
}
inline void init(){
key[n]=-;id=;
for(int i=;i<=n;++i){
to[i]=id;
if(key[i])l[id]=r[id]=id++;
}--id;
for(int i=;i<=m;++i){
int x=to[d[i].x],y=to[d[i].y];
key[x]=y;
if(x<y)add(x,x+);
else add(x+,x);
}
}
int main(){
n=read(),m=read(),p=read();
for(int i=;i<=m;++i){
d[i].x=read(),d[i].y=read();
key[d[i].x]=d[i].y;
}
init();dfs();
for(int i=;i<=p;++i){
int x=to[read()],y=to[read()];
if(l[x]<=y&&y<=r[x])putchar('Y'),putchar('E'),putchar('S'),putchar('\n');
else putchar('N'),putchar('O'),putchar('\n');
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ5288 & 洛谷4436 & LOJ2508:[HNOI/AHOI2018]游戏——题解的更多相关文章
- BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...
- BZOJ5289 & 洛谷4437:[HNOI/AHOI2018]排列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5289 https://www.luogu.org/problemnew/show/P4437 考虑 ...
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
- 洛谷P4426 毒瘤 [HNOI/AHOI2018] 虚树+树上dp
正解:虚树+树上dp 解题报告: 传送门! 首先解释一下题意趴,,,语文70pts选手已经开始看不懂题辣QAQ 大概就是个给一个图,求独立集方案,且保证图是联通的,边的数量最多只比点多10 首先思考如 ...
- 洛谷P4437 排列 [HNOI/AHOI2018] 贪心
正解:贪心 解题报告: 传送门! 发现做题龟速,,,所以懒得写题目大意辣自己get一下QAQ 首先看到ai<=n,又当ai=j时j在i的前面,所以就变成对于每个点i有一个约束,即要求第ai个节点 ...
- 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp
正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...
- 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)
题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...
- 洛谷P1512伊甸园的日历游戏题解
题目 因为可能要参加qbxt的数论考试,所以最近要开始猛刷数论题了. 这是第一道,不过看样子并不想数论题啊,只是一个博弈论. 思路 一位著名老师说过,数学就是转化和化简,所以先考虑化简,先考虑化简年份 ...
随机推荐
- MyBatis-SpringMVC整合
1.添加spring相关jar包 2.配置ehcache jar包. 3.添加ehcache mybatis 适配器jar包(在mybatis官网) 4.添加spring mybatis 适配器jar ...
- dubbo入门(一)
1.简介 Dubbo由阿里巴巴开源,是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用)远程服务调用方案,以及SOA服务治理方案.如果没有分布式的需求,Dbubbo是不需要的,其本质 ...
- Linux命令应用大词典-第37章 Linux系统故障排错
37.1 mkbootdisk:创建用于运行系统的独立启动软盘 37.2 chroot:切换根目录环境 37.3 badblocks:搜索设备的坏块 37.4 mkinitrd:创建要载入ramdis ...
- Linux命令应用大词典-第36章 密码和证书管理
36.1 pwdhash:密码哈希生成器 36.2 mkpasswd:生成应用于用户的新密码 36.3 keytool:密钥和证书管理工具 36.4 certutil:证书服务器管理工具 36.5 v ...
- 【springmvc+mybatis项目实战】杰信商贸-1.项目背景
1.项目背景杰信项目物流行业的项目,杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快 ...
- ThinkPHP - 3 - IDE选择以及Eclipse PDT打开ThinkPHP项目
ThinkPHP框架已部署到SAE(新浪云),且代码已获取到本地.眼前面临的问题就是,对ThinkPHP项目选择哪种开发工具(IDE)? 经过简单的查找比较,以及电脑里已装有Eclipse的因素,遂决 ...
- mysql数据库配置主从同步
MySQL主从同步的作用 .可以作为一种备份机制,相当于热备份 .可以用来做读写分离,均衡数据库负载 MySQL主从同步的步骤 一.准备操作 .主从数据库版本一致,建议版本5.5以上 .主从数据库数据 ...
- 课堂练习之找数字0-N中“1”出现的次数
一.题目与要求 题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12) ...
- ACM hust 2.1
来自咸鱼王的呻吟 http://www.xiami.com/song/3599639?spm=a1z1s.3521865.23309997.1.PbLu7E 配合咸鱼食用效果更佳(右键新窗口打开) 题 ...
- C#中委托的发展与匿名函数
匿名函数(C# 编程指南) 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数 ...