首页 > 其他分享 >cf791 D. Toss a Coin to Your Graph...

cf791 D. Toss a Coin to Your Graph...

时间:2023-02-03 04:22:05浏览次数:43  
标签:... int Graph ll cin cf791 limit rep define

这题问给出一个有向图,问走k步,每次费用为路径上的最大值,最大值最小是多少

这种minmax问题,首先想到二分,然后我们可以对这个答案进行二分

然后观察一下,如果能走k步,那么说明去除所有大于mid的点的影响之后,要么最长路长度是大于等于k,要么存在环

可以用拓扑排序一次求出,重新建图,然后判断入队点数等不等于有效点数或者最长路大于等于k

#include <bits/stdc++.h>
using namespace std;
constexpr int limit =  (200000 + 5);//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-9
#define FASTIO  ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a, b) pair<a,b>
#define rep(i, a, b) for(ll i = a; i <= b ; ++i)
#define per(i, a, b) for(ll i = b ; i >= a  ; --i)
#define MOD 998244353
#define traverse(u) for(int i = head[u]; ~i ; i = edge[i].nxt)
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\akioi\\data.txt", "rt", stdin)
#define FOUT freopen("C:\\Users\\tiany\\CLionProjects\\akioi\\dabiao.txt", "wt", stdout)
typedef long long ll;
typedef unsigned long long ull;
char buf[1 << 23], *p1 = buf, *p2 = buf, obuf[1 << 23], *O = obuf;

inline ll read() {
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    ll sign = 1, x = 0;
    char s = getchar();
    while (s > '9' || s < '0') {
        if (s == '-')sign = -1;
        s = getchar();
    }
    while (s >= '0' && s <= '9') {
        x = (x << 3) + (x << 1) + s - '0';
        s = getchar();
    }
    return x * sign;
#undef getchar
}//快读
void print(ll x) {
    if (x / 10) print(x / 10);
    *O++ = x % 10 + '0';
}

void write(ll x, char c = 't') {
    if (x < 0)putchar('-'), x = -x;
    print(x);
    if (!isalpha(c))*O++ = c;
    fwrite(obuf, O - obuf, 1, stdout);
    O = obuf;
}

int n,m;
int a[limit];
vector<int>g[limit], g2[limit];
int deg[limit];
int deg2[limit];
int dp[limit];
void solve(){
    ll k;
    cin>>n;
    cin>>m;
    cin>>k;
    priority_queue<pi(int, int)>q;
    rep(i,1,n){
        cin>>a[i];
    }
    rep(i,1,m){
        int u,v;
        cin>>u>>v;
        deg[v]++;
        g[u].push_back(v);
    }
    auto check = [&](ll x)->bool{
        queue<int>q;
        int tot = 0;
        rep(i,1,n){
            deg2[i] = 0;
            g2[i].clear();
            dp[i] = -1;
        }
        rep(i,1,n){
            tot += (a[i] <= x);
            for(auto && v : g[i]){
                if(a[i] <= x and a[v] <= x){
                    g2[i].push_back(v);
                    deg2[v]++;
                }
            }
        }
        rep(i,1,n){
            if(!deg2[i] and a[i] <= x){
                q.push(i);
                dp[i] = 0;
//                dp[i] = 0;
            }
        }
        int inq = 0;

        while(!q.empty()){
            int u = q.front();
            q.pop();
//            cout<<u<<" f"<<endl;
            inq++;
            for(auto v : g2[u]){
                deg2[v]--;
                dp[v] = max(dp[v], dp[u] + 1);
                if(deg2[v] == 0){
                    q.push(v);
                }else{
//                    cout<<v<<" "<<deg2[v]<<endl;
                }
            }
        }
//        cout<<"inqueue "<<inq<<endl;
//        cout<<"tot "<<tot<<endl;
        int flag = *max_element(dp + 1, dp + 1 + n) >= k - 1 or inq != tot;

        return flag;
    };
    ll ans = -1;
//    cout<<check(5<<1)<<endl;
    for(ll l = 1, r = 2e9; l <= r; ){

        ll mid = l + (r - l) / 2;
        if(check(mid)){
            r = mid - 1;
            ans = mid;
        }else{
            l = mid + 1;
        }
    }
    cout<<ans<<endl;

};
int32_t main() {
#ifdef LOCAL
    FOPEN;
//    FOUT;
#endif
    FASTIO
//    int kase;
//    cin>>kase;
//    while (kase--)
        invoke(solve);
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
    return 0;
}

标签:...,int,Graph,ll,cin,cf791,limit,rep,define
From: https://www.cnblogs.com/tiany7/p/17087910.html

相关文章

  • 你能比较一下 GraphQL 和 tRPC 吗?
    介绍Twitter上有很多关于“GraphQL与tRPC”的讨论,用于为您的应用程序构建现代后端。GraphQL近年来作为REST事实上的继承者而变得流行起来,而tRPC解决了全栈应用程序中......
  • GraphQL 与 REST API使用对比
    介绍简单说一下GraphQL与RESTAPI的的对比文章修改和引用与:https://avocadev.hashnode.dev/graphql-vs-rest-putting-it-to-rest正文使用对比看看下面的示例中的J......
  • 【Flink】详解StreamGraph
    【Flink】详解StreamGraph大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!概述没有看上一......
  • 从实测出发,掌握 NebulaGraph Exchange 性能最大化的秘密
    自从开发完NebulaGraphExchange,混迹在各个NebulaGraph微信群的我经常会看到一类提问是:NebulaGraphExchange的性能如何?哪些参数调整下可以有更好的性能?…索性来一篇文......
  • 如何快速掌握一门新技术/语言/框架...
    IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话,那么你的核心竞争力就是IT相关......
  • 微软外服札记④——Spark中的那些坑...
    Spark中的那些坑Spark中的那些坑前言读取配置文件时区陷阱怪异的DayOfWeeksubstring陷阱IP地址解析枚举的数值posexplode函数为什么我的程序运行那么慢?慎用Co......
  • kali 更新到最新版(测试中...)
    #确认源(下面用阿里云的源举例)echo"debhttps://mirrors.aliyun.com/kalikali-rollingmainnon-freecontrib"|sudotee/etc/apt/sources.list#更新和升级(消耗时......
  • 「CF1792F2」Graph Coloring (Hard Version)
    代码点这里看题目。有一个\(n\)​个点的无向有标号完全图,你需要给每一条边染上红色或者蓝色。对于一个点集\(S\)(\(|S|\ge2\)),如果仅保留红边时\(S\)中的点是连通......
  • 【参考答案】java基础练习:循环结构(while、do...while、for、break、continue、return
    while while实现:输出比i(i=5)小的正整数packagecom.qzcsbj;publicclassTest{publicstaticvoidmain(String[]args){inti=5;while(--i>0){......
  • C - Path Graph
    C-PathGraphhttps://atcoder.jp/contests/abc287/tasks/abc287_c 思路判断所有点组成一个链的路径 根据每个节点的度来判断:链路的度:两边为节点度为1,中间所......