zoukankan      html  css  js  c++  java
  • CF1515F. Phoenix and Earthquake

    题目描述

    题解

    如果 $\Sigma a_i < (n-1)x$ ,说明不可以。

    否则证明其一定可以。

    假设 $a_1 \le a_2 \le ... \le a_n$ ,则如果 $a_n+a_1<x$ ,则 $a_1 \le a_2 \le ... \le a_n <x-a_1$ ,则 $\Sigma a_i < (n-1)x-(n-2)a_1$ ,矛盾。因此我们可以每次让最大的和其相邻的任意一点合并即可。

    代码

    #include<bits/stdc++.h>
    #define M make_pair
    using namespace std;
    #define LL long long
    const int N=6e5+5;
    int n,m,f[N],R[N],g[N],p[N],t[N];
    LL a[N],X;
    vector<pair<int,int>>e[N];
    struct O{
        LL x;int u;
    };
    bool operator < (O A,O B){
        return A.x<B.x;
    }
    priority_queue<O>q;
    int get(int x){
        return x==f[x]?x:f[x]=get(f[x]);
    }
    int main(){
        scanf("%d%d%lld",&n,&m,&X);
        for (int i=1;i<=n;i++)
            scanf("%lld",&a[i]),
            a[0]+=a[i],g[i]=p[i]=f[i]=i;
        for (int i=1,u,v;i<=m;i++)
            scanf("%d%d",&u,&v),
            t[u]++,t[v]++,
            e[u].push_back(M(v,i)),
            e[v].push_back(M(u,i));
        if (a[0]<X*(n-1)){puts("NO");return 0;}
        puts("YES");
        for (int i=1;i<=n;i++)
            q.push((O){a[i],i});
        while(!q.empty()){
            O u=q.top();q.pop();
            if (get(u.u)!=u.u) continue;
            int x=p[u.u];bool fl=1;
            while(fl && x){
                for (int i=t[x]-1,v;~i;i--){
                    v=e[x][i].first;t[x]--;
                    if (get(v)==u.u) continue;
                    v=get(v);a[u.u]+=a[v]-X;
                    printf("%d\n",e[x][i].second);
                    R[g[u.u]]=p[v];g[u.u]=g[v];
                    f[v]=u.u;fl=0;break;
                }
                if (fl) x=R[x],p[u.u]=x;
            }
            if (!fl) q.push((O){a[u.u],u.u});
        }
        return 0;
    }
  • 相关阅读:
    Python 多线程、进程
    Python网络编程 Socket编程
    Python基础7 面向对象编程进阶
    Python基础6 面向对象编程
    Python基础5 常用模块学习
    Python基础4 迭代器、装饰器、软件开发规范
    Python基础3 函数、递归、内置函数
    Python基础2 列表 字典 集合
    21-Python-多进程
    20-Python-queue队列
  • 原文地址:https://www.cnblogs.com/xjqxjq/p/15439402.html
Copyright © 2011-2022 走看看