竟然做了一晚上才AC
发题解警示自己犯糖
一道思维题,推公式即可
首先手玩一下样例发现 m=1,m=2均无法成功,直接输出
如果大于2一定存在范围[L,R]可以胜利
对于最小值,不难想到对于完全图可以使n最小,且完全图的合法炸弹数一定小于一个m条边的m元环(在环内连接边一定不会更劣嘛)
所以根据公式可知 n*(n-1)>=m,暴力时间复杂度 O(nT) 太劣了,考虑预处理+二分优化,时间复杂度 O(Tlogn+n),比较优
再考虑最大值,注意到对于一条边,让它的贡献最大必然是连接两个孤立点,这样它的贡献是两个点,发现连成链或者环每个边的贡献都不如它优,这样我们每一条边获得了两个点的贡献,同时会有一个炸弹合法,我们只能让m-1个炸弹合法,所以最大有2*(m-1)个点,最后一条边随意连接两个孤立的连通块即可。
火花真可爱awa
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int m;
const int N=4e5+10;
int f[N];
void init()
{for(int i=1; i<=1e5;i++) { f[i]=i*(i-1);}
}int check(int x)
{int l=1,r=1e5;while(l<r){int mid=(l+r)>>1;if(f[mid]>=x) r=mid;else l=mid+1;}return r;
}
signed main(){int T;cin>>T;init(); while(T--){cin>>m;if(m<=2) cout<<"Lose!";else{cout<<check(2*m)<<" ";cout<<2*(m-1);}cout<<endl;}
}