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;
}