中位数

    技术2024-05-07  22

    题目链接:中位数


    显然可二分,然后把小于的看成-1,然后大于等于的看成1.

    就是找是否存在一条1到n长度大于等于0的路径。

    直接DAG上最长路即可。


    AC代码:

    #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; const int N=1e6+10; int n,m,a[N],x[N],y[N],deg[N],dp[N]; vector<int> g[N]; inline int check(int mid){ for(int i=1;i<=m;i++) deg[y[i]]++; queue<int> q; for(int i=1;i<=n;i++) dp[i]=-1e9; dp[1]=(a[1]>=mid?1:-1); for(int i=1;i<=n;i++) if(!deg[i]) q.push(i); while(q.size()){ int u=q.front(); q.pop(); for(int to:g[u]){ if(--deg[to]==0) q.push(to); dp[to]=max(dp[to],dp[u]+(a[to]>=mid?1:-1)); } } return dp[n]>=0; } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d %d",&x[i],&y[i]),g[x[i]].push_back(y[i]); int l=0,r=1e9; while(l<r){ int mid=l+r+1>>1; if(check(mid)) l=mid; else r=mid-1; } if(check(l)) cout<<l; else cout<<-1; return 0; }
    Processed: 0.011, SQL: 9