CF1065B Vasya and Isolated Vertices 题解

CF1065B Vasya and Isolated Vertices 题解

题目分析

看着构造的标签进来的,进来前没想到这么简单

首先保留节点的最小值,就是让每一条边连接当前度数为 0 的两个点,这样子可以最大程度地利用每一条边。

所以 (min=max(0,n-2*m))

那么保留节点的最大值,也就等价于最少的点连最多的边,很容易想到完全图,也就是点数为 (n) 的简单图 (G) ,最多有 (frac{n*(n-1)}{2}) 条边。

二分出边数 (geq m) ,点数最小且为 (t) 的完全图,

(max=n-t)

Code:

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=false;
    while(!isdigit(ch)) f|=ch=='-',ch=getchar();
    while(isdigit(ch))  x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=f?-x:x;return;
}
template <typename T>
inline void print(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);
    putchar(x%10^48);return;
}
#define ll long long
ll n,m;
int main(){
    read(n),read(m);ll minn=0,maxn=0;
    minn=max(0ll,n-2*m);print(minn),putchar(' ');
    ll l=0,r=n;
    while(l<=r){
        ll mid=(l+r)>>1;
        if(mid*(mid-1)/2>=m)    r=mid-1,maxn=mid;
        else l=mid+1;
    }
    print(n-maxn);
    return 0;
}
原文地址:https://www.cnblogs.com/NuoCarter/p/15261727.html