题目大意:
  $n(n\le5\times10^5)$个房间排成一排,相邻两个房间之间有一扇门,第$i$个房间和第$i+1$个房间之间的门可以用第$c_i$种钥匙打开(可能有多个门可以用同一种钥匙打开)。告诉你每个房间有哪几种钥匙。$q(q\le5\times10^5)$次询问,每次询问若一开始在$s$房间,能否到达$t$房间。

思路:
  分别用$l[i],r[i]$表示房间$i$能扩展到的最左/最右的房间。
  对于每种钥匙用一个数组存一下它出现过的房间位置。枚举每个点$i$,若$c_{l[i]-1}$在$l[i]\sim r[i]$中出现过,则$l[i]-1$能走到的$i$一定能走到,$r[i]+1$同理。不断向左、向右进行扩展。这样总共是$O(n^2\log n)$的,不过因为数据水,跑得比真算法还快。

 #include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=5e5+;
int c[N],l[N],r[N];
std::vector<int> pos[N];
inline bool find(const int &c,const int &l,const int &r) {
return *std::lower_bound(pos[c].begin(),pos[c].end(),l)<=r;
}
int main() {
const int n=getint();
for(register int i=;i<n;i++) c[i]=getint();
for(register int i=;i<=n;i++) {
for(register int j=getint();j;j--) {
pos[getint()].push_back(i);
}
}
for(register int i=;i<=n;i++) {
pos[l[i]=r[i]=i].push_back(n+);
}
for(register int i=;i<=n;i++) {
for(register int j=;;j=) {
if(r[i]!=n&&find(c[r[i]],l[i],r[i])) j=r[i]+;
if(l[i]!=&&find(c[l[i]-],l[i],r[i])) j=l[i]-;
if(!j) break;
l[i]=std::min(l[i],l[j]);
r[i]=std::max(r[i],r[j]);
}
}
for(register int i=getint();i;i--) {
const int s=getint(),t=getint();
puts(l[s]<=t&&t<=r[s]?"YES":"NO");
}
return ;
}

[JOISC2017]細長い屋敷的更多相关文章

  1. 「题解」:[loj2763][JOI2013]现代豪宅

    问题 A: 现代豪宅 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...

  2. 爬虫入门六 总结 资料 与Scrapy实例-bibibili番剧信息

    title: 爬虫入门六 总结 资料 与Scrapy实例-bibibili番剧信息 date: 2020-03-16 20:00:00 categories: python tags: crawler ...

  3. [亂數] <細說> C/C++ 亂數基本使用與常見問題

    陸陸續續寫了 EA  一.二年,以前亂數引導文回頭看時才發現,怎麼有這麼多細節的錯誤.沒系統. 這篇文章主要引導初學者使用亂數,同時附上常被翻出來討論的議題,C/C++適用,唯以 C 語言撰之. 也由 ...

  4. oracle 查詢表字段明細、字段注釋、表註釋

    查詢表字段明細 select  column_name,data_type,data_length,DATA_PRECISION ,DATA_SCALE from all_tab_columns wh ...

  5. PCB 敷铜间距规则(转)

    第一优先规则: First Object = InPolygon, Second Object = All 第二优先规则:First Object = All, Second Object = All ...

  6. C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN

    C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN.NET 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够 ...

  7. PHP 計算字符串長度函數

    PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所占的字節數.對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差 ...

  8. PCB敷铜小结

    有人说加大敷铜可以加大散热面,其实,对于此我不以为然.我说过铜是一种散热吸热快的金属,如果加大散热面要靠加大敷铜的面积的话,那就没有必要给很多的器件加热片了,我想大家对于计算机都颇有心得,一定攒过电脑 ...

  9. 浅谈PCB敷铜的“弊与利”

    敷铜作为PCB设计的一个重要环节,不管是国产的青越锋PCB设计软件,还国外的一些Protel,PowerPCB都提供了智能敷铜功能,那么怎样才能敷好铜,我将自己一些想法与大家一起分享,希望能给同行带来 ...

随机推荐

  1. python3初识selenium

    第一步:安装与配置 1.电脑上需要有火狐浏览器(默认安装在C:\Program Files (x86)\Mozilla Firefox目录下). 2.使用pip install selenium安装好 ...

  2. centos7 mysql cluster集群搭建基于docker

    1.准备 mn:集群管理服务器用于管理集群的其他节点.我们可以从管理节点创建和配置集群上的新节点.重新启动.删除或备份节点. db2/db3:这是节点间同步和数据复制的过程发生的层. db4/db5: ...

  3. VC++使用CImage在内存中Bmp转换Jpeg图片

    之前写了一篇<VC++使用CImage在内存中Jpeg转换Bmp图片>,通过CImage实现了在内存中Jpeg转Bmp. 既然Jpeg能转Bmp,那CImage也支持Bmp转Jpeg,与上 ...

  4. 创建 React 项目

    依次输入命令: npm install -g create-react-app create-react-app react16 cd my-app npm start 在浏览器中输入 local:3 ...

  5. Java并发(5)- ReentrantLock与AQS

    引言 在synchronized未优化之前,我们在编码中使用最多的同步工具类应该是ReentrantLock类,ReentrantLock拥有优化后synchronized关键字的性能,又提供了更多的 ...

  6. org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported解决!

    org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported解决 ...

  7. 动态规划:LCIS

    先给出状态转移方程: 定义状态 F[i][j]表示以a串的前i个整数与b串的前j个整数且以b[j]为结尾构成的LCIS的长度 状态转移方程: ①F[i][j] = F[i-][j] (a[i] != ...

  8. 浏览器web端详解

    一.背景介绍浏览器是前端工程师或页面重构师工作中必不可少的,WEB页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验,特别是浏览器渲染页面的原理,页面渲染就是浏览器将HTML ...

  9. keras_实现cnn_手写数字识别

    # conding:utf-8 import os os.environ[' import numpy as np from keras.models import Sequential from k ...

  10. angular2框架搭建,angular-cli使用,angular2学习

    angular红红火火很多年了,一眨眼ng4都出来了,我也只能叹息前端的日新月异,以及感叹自己永远追赶不上时代的步伐,但是没关系,一个优秀的前端不在于他懂的无数的框架,而在于遇到问题时候懂得如何学习, ...