QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#816472#9812. Binary Searchrqoi031WA 5ms18004kbC++202.2kb2024-12-16 11:53:172024-12-16 11:53:19

Judging History

This is the latest submission verdict.

  • [2024-12-16 11:53:19]
  • Judged
  • Verdict: WA
  • Time: 5ms
  • Memory: 18004kb
  • [2024-12-16 11:53:17]
  • Submitted

answer

#include<stdio.h>
#include<algorithm>
#include<cstring>
constexpr int inf{0x3f3f3f3f};
constexpr int N{300000};
struct edge {
    int v,next;
};
edge e[(N<<1)+5];
int en,last[N+5];
inline void add_edge(const int &u,const int &v) {
    e[++en]={v,last[u]},last[u]=en;
    e[++en]={u,last[v]},last[v]=en;
}
int a[N+5];
int deg[N+5][4];
int dis[N+5][4];
int tmp[N+5][4];
int que[(N<<2)+5];
int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        scanf("%d",a+i);
    }
    for(int i=1;i<=m;i++) {
        int u,v;
        scanf("%d%d",&u,&v);
        add_edge(u,v);
    }
    int ans{inf};
    for(int c=0;c!=4;c++) {
        int val[4]{c&1,c>>1,c&1^1,(c>>1)^1};
        std::memset(dis,0x3f,sizeof(dis));
        std::memset(tmp,0,sizeof(tmp));
        std::memset(deg,0,sizeof(deg));
        for(int i=1;i<=n;i++) {
            for(int j=0;j!=4;j++) {
                if(a[i]==val[j+1&3]) {
                    for(int k=last[i];k;k=e[k].next) {
                        ++deg[e[k].v][j];
                    }
                }
            }
        }
        int qb{1},qe{0};
        for(int i=1;i<=n;i++) {
            for(int j=0;j!=4;j++) {
                if(deg[i][j]==0&&a[i]==val[j]) {
                    dis[i][j]=1;
                    que[++qe]=i<<2|j;
                    printf("> %d %d\n",i,j);
                }
            }
        }
        while(qb<=qe) {
            int &_{que[qb++]};
            int u{_>>2},t0{_&3},t1{t0-1&3};
            for(int i=last[u];i;i=e[i].next) {
                int &v{e[i].v};
                if(a[v]!=val[t1]) {
                    continue;
                }
                tmp[v][t1]=std::max(tmp[v][t1],dis[u][t0]+1);
                if(!--deg[v][t1]) {
                    dis[v][t1]=tmp[v][t1];
                    que[++qe]=v<<2|t1;
                }
            }
        }
        int len{0};
        for(int i=1;i<=n;i++) {
            if(a[i]==val[0]) {
                len=std::max(len,dis[i][0]);
            }
        }
        ans=std::min(ans,len);
    }
    if(ans>=inf) {
        puts("infinity");
    }
    else {
        printf("%d\n",ans+1);
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 5ms
memory: 18004kb

input:

4 4
0 0 1 1
1 2
1 3
2 3
3 4

output:

> 4 3
> 4 0
> 4 2
> 4 1
4

result:

wrong answer 1st lines differ - expected: '4', found: '> 4 3'