Luogu P4436 [HNOI/AHOI2018]游戏

时间:2019-11-26
本文章向大家介绍Luogu P4436 [HNOI/AHOI2018]游戏,主要包括Luogu P4436 [HNOI/AHOI2018]游戏使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目
我们要求出\(l_i,r_i\)表示\(i\)最远能够到达的最左边和最右边的格子。
首先有一个比较简单的暴力,就是每次我们选择一个格子,然后从当前格子开始往左右暴力扩展,找到能够到达的最远的格子。
然后对于这个暴力,我们有一个小小的优化:就是假如我们从左往右处理,当前的点是\(i\),新扩展到了一个左边的节点\(j\),那么我们可以直接拿\(l_j\)赋给\(l_i\),如此重复。右边同理。
这样的暴力是可以被卡成\(O(n^2)\)的。但是题目数据水所以可以通过。
现在我们通过一些优化来使得这个暴力的复杂度变得正确。
对于一段连续的没有门的格子,我们可以把它缩成一个格子。
然后对于一个门和钥匙\((x,y)\),如果\(y>x\),我们就从\(x\)\(x+1\)建一条边,意思是无法从\(x\)走到\(x+1\)\(y<x\)同理。
这样我们再拓扑排序,因为点\(u\)的答案区间一定不会包含拓扑序在它后面的点的答案区间,所以按照拓扑序转移就能够保证复杂的正确性了,最后复杂度为\(O(n+m)\)

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
namespace IO
{
    char ibuf[(1<<21)+1],*iS,*iT;
    char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
    int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
}
using namespace IO;
const int N=1000007;
vector<int>E[N];queue<int>q;
int n,m,Q,x[N],y[N],pos[N],cnt=1,l[N],r[N],f[N],deg[N],bel[N];
void add(int u,int v){E[u].pb(v),++deg[v];}
int check(int x,int y)
{
    if(!y||y==cnt+1) return 0;
    if(x<y) --y;
    return l[x]<=pos[y]&&pos[y]<=r[x];
}
void toposort()
{
    for(int i=1;i<=cnt;++i) if(!deg[i]) q.push(i);
    for(int u,f;!q.empty();)
    {
    u=q.front(),q.pop(),f=1;
    while(f)
    {
        f=0;
        while(check(u,l[u]-1)) l[u]=l[l[u]-1],f=1;
        while(check(u,r[u]+1)) r[u]=r[r[u]+1],f=1;
    }
    for(int v:E[u]) if(!(--deg[v])) q.push(v);
    }
}
int main()
{
    n=read(),m=read(),Q=read();
    for(int i=1;i<=m;++i) x[i]=read(),y[i]=read(),f[x[i]]=1;
    f[n]=1;
    for(int i=1;i<=n;++i) if(bel[i]=cnt,f[i]) l[cnt]=r[cnt]=cnt,++cnt;
    --cnt;
    for(int i=1,u,v;i<=m;++i)
    {
    u=bel[x[i]],v=bel[y[i]],pos[u]=v;
    if(v<=u) add(u+1,u); else add(u,u+1);
    }
    toposort();
    for(int u,v;Q;--Q) u=bel[read()],v=bel[read()],puts(l[u]<=v&&v<=r[u]? "YES":"NO");
}

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11936499.html