QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#668993#4420. Range Reachability QueryWilliamxzhAC ✓3840ms84844kbC++232.0kb2024-10-23 16:57:192024-10-23 16:57:20

Judging History

你现在查看的是最新测评结果

  • [2024-10-23 16:57:20]
  • 评测
  • 测评结果:AC
  • 用时:3840ms
  • 内存:84844kb
  • [2024-10-23 16:57:19]
  • 提交

answer

#include <bits/stdc++.h>
#define il inline
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
il int read(){
    int x=0,c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=x*10+c-48,c=getchar();
    return x;
}
const int N=50003,M=1e5+3,B=4096;
int T,n,m,Q,in[N],ans[N],b[M],k;pii a[M];
bitset<B> s[N],t[M];
struct node{
    int x,y,l,r;
    il node(){x=y=l=r=0;}
    il node(int x,int y,int l,int r) : x(x),y(y),l(l),r(r) {}
}q[N];
vector<int> e[N];
il void solve(int l,int r){
    int x,y,z,u,v,w;
    if(l>=0){
        for(int i=1;i<=n;++i) s[i].reset();
        for(int i=1;i<=m;++i) t[i].reset();
    }
    for(int i=l;i<=r;++i){
        x=q[i].x,u=q[i].l,v=q[i].r,s[x][i-l]=1;
        t[u][i-l]=1,t[v+1][i-l]=1;
    }
    for(int i=2;i<=m;++i) t[i]^=t[i-1];
    for(int i=1;i<=m;++i){
        x=a[b[i]].fi,y=a[b[i]].se;
        s[y]|=(s[x]&t[b[i]]);
    }
    for(int i=l;i<=r;++i) ans[i]=s[q[i].y][i-l];
}
int qq[N],hh,tt;
il void topo(){
    int x,y,z,u,v,w;hh=1,tt=0;
    for(int i=1;i<=n;++i) if(!in[i]) qq[++tt]=i;
    while(hh<=tt){
        x=qq[hh++];
        for(int it:e[x]){
            y=a[it].se,b[++k]=it;
            if(!(--in[y])) qq[++tt]=y;
        }
    }
}
il void init(){
    for(int i=0;i<=n;++i) in[i]=qq[i]=0,e[i].clear();
    for(int i=0;i<=m;++i) a[i]={0,0},b[i]=0;
    for(int i=0;i<=Q;++i) q[i]={0,0,0,0};
    k=0;
}
int x,y,z,u,v,w,l,r;
int main(){
    //freopen("ex_c3.in","r",stdin);
    //freopen("ex_c3_my.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&Q);init();
        for(int i=1;i<=m;++i) x=read(),y=read(),a[i]={x,y},e[x].push_back(i),++in[y];
        topo();
        for(int i=0;i<Q;++i) q[i].x=read(),q[i].y=read(),q[i].l=read(),q[i].r=read();
        for(int i=0;i<=(Q>>12);++i){
            l=(i<<12),r=min(Q-1,((i+1)<<12)-1);
            solve(l,r);
        }
        for(int i=0;i<Q;++i) puts(ans[i]?"YES":"NO");
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3840ms
memory: 84844kb

input:

10
50000 100000 50000
42489 42490
40572 40573
33841 33842
18146 37295
31294 31295
9813 45992
25570 38939
24581 24582
13580 38328
35265 35266
11229 11230
28548 28549
25253 45063
9721 9722
31522 35509
4701 18080
8261 11199
35982 35983
26823 26824
44922 44923
19236 44157
41597 41598
22648 22649
39838 3...

output:

NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO...

result:

ok 500000 lines