bzoj 5288 游戏

  • 显然从点 \(x\) 出发,能到达的点是包含 \(x\) 的一段区间.用 \(L,R\) 两个数组记录每个点对应的区间端点.
  • 如果能预处理出 \(L,R\) ,询问显然可以 \(O(1)\) 回答.
  • 先考虑最朴素的暴力,枚举每个点 \(x\) ,从 \(x\) 往两边跳,如果去下个点的门没有锁,或者钥匙的位置在 \([L_x,R_x]\) 内,就继续拓展.
  • 有一个比较简单的优化,拓展到了一个点 \(y\) 后,就用 \(y\) 的 \(L,R\) 值更新 \(x\) 的.这样做能获得 \(20\) 分的好成绩.
  • 为了使这个优化减少更多的跳跃次数(???不负责口胡),我们对枚举 \(x\) 的顺序随机化,执行上述的算法.
  • 实践可以获得 \(100\) 分. 这样做期望大概是 \(O(nlogn)\) 的?但我不会证.如果求出了期望时间复杂度,请务必告知.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXN=1e6+10;
int n,m,Q;
int ord[MAXN];
int L[MAXN],R[MAXN],a[MAXN];
void solve(int x)
{
int l=x,r=x;
while(1)
{
int f=0;
if(l>1 && (!a[l-1] || (l<=a[l-1] && a[l-1]<=r)))
f=1,--l,l=min(l,L[l]),r=max(r,R[l]);
if(r<n && (!a[r] || (l<=a[r] && a[r]<=r)))
f=1,++r,l=min(l,L[r]),r=max(r,R[r]);
if(!f)
break;
}
L[x]=l,R[x]=r;
}
int main()
{
n=read(),m=read(),Q=read();
for(int i=1;i<=m;++i)
{
int x=read(),y=read();
a[x]=y;
}
for(int i=1;i<=n;++i)
ord[i]=i,L[i]=n+1,R[i]=0;
srand(19260817);
random_shuffle(ord+1,ord+1+n);
for(int i=1;i<=n;++i)
solve(ord[i]);
while(Q--)
{
int s=read(),t=read();
if(L[s]<=t && t<=R[s])
puts("YES");
else
puts("NO");
}
return 0;
}

bzoj 5288 游戏的更多相关文章

  1. BZOJ.5288.[AHOI/HNOI2018]游戏(思路 拓扑)

    BZOJ LOJ 洛谷 考虑如何预处理每个点能到的区间\([l,r]\). 对于\(i,i+1\)的一扇门,如果钥匙在\(i\)的右边,连边\(i\to i+1\),表示从\(i\)出发到不了\(i+ ...

  2. bzoj 5288: [Hnoi2018]游戏

    Description Solution 乱搞能A的题,毁我青春 记忆化一下扩展过程 只要不是从 \(1\) 枚举到 \(n\) 去扩展都可以 \(AC\) 于是 \(random\_shuffle\ ...

  3. bzoj 1854 游戏 二分图匹配 || 并查集

    题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...

  4. BZOJ 1854 游戏

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有\(2\)个属性,这些属性的值用\([1,10000]\)之间的数表示.当他使用某种装备时,他只能使用该 ...

  5. BZOJ 1025 游戏

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...

  6. BZOJ 1443 游戏(二分图博弈)

    新知识get. 一类博弈问题,基于以下条件: 1.博弈者人数为两人,双方轮流进行决策.2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集).任意合法的决策(对应边) ...

  7. bzoj 4465 游戏中的学问

    Written with StackEdit. Description 大家应该都见过很多人手拉手围着篝火跳舞的场景吧?一般情况下,大家手 拉手跳舞总是会围成一个大圈,每个人的左手拉着旁边朋友的右手, ...

  8. bzoj 4457: 游戏任务

    4457: 游戏任务 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 128  Solved: 71[Submit][Status][Discuss] D ...

  9. BZOJ 1854 游戏(二分图匹配或并查集)

    此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个 ...

随机推荐

  1. MapReduce 应用实例

    Hadoop 版本2.8.0 前期准备工作: 1. 设置用户环境变量 PATH 和 CLASSPATH 方便执行 Hadoop 命令时不用转移到对应的目录下,shell 除了会在当前目录下还会到 PA ...

  2. LA 3295 数三角形

    https://vjudge.net/problem/UVALive-3295 题意: 数出n行m列的网格顶点能组成多少个三角形. 思路: 直接去数的话比较麻烦,这道题目是可以重复的,只要位置不同就可 ...

  3. JVM与垃圾回收机制(GC)和类的生命周期

    JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...

  4. angular中的cookies与cookieStore区别

    设置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如设置一个cookie,名为 ...

  5. linux下鼠标穿透和取消穿透--linux小白,大神无视

    最近在用qt写一个跨平台的软件,因为设置了无边框,并且我自己给程序窗口加了阴影,阴影范围又比较大 所以必须给阴影区域加上鼠标穿透才能有更好的体验. 上网查了一下,在windows下使用SetWindo ...

  6. linux-shutdown命令说明

    showdown命令: -k  不是真正关闭电脑,只是警告. -h 关闭后暂停 -r 关闭后重新引导 -c 取消已经运行的关闭操作 -n 不通过init直接关闭 -f 快速重新引导 time 关闭的时 ...

  7. Code Cache相关知识总结

    codecache代码缓存区,主要存放JIT所编译的代码,同时还有Java所使用的本地方法代码也会存储在codecache中.不同的jvm.不同的启动方式codecache的默认值大小也不尽相同. J ...

  8. Python中字符的练习

    一.重复的单词:此处认为分隔符为空格:个整数-]): list.append(random.randint(, ))for i in list: d[i]=list.count(i)print d

  9. Git 配置ssh key的步骤

    First start by setting up your own public/private key pair set. This can use either DSA or RSA, so b ...

  10. Android 图片压缩各种方式

       前言:由于公司项目当中需要用到压缩这块的相应技术,之前也做过的图片压缩都不是特别的理想, 所以这次花了很多心思,仔细研究和在网上找到了很多相对应的资料.为了就是 以后再做的时候直接拿来用就可以了 ...