洛谷月赛T1 P14081 「CZOI-R7」炸弹游戏
竟然做了一晚上才AC
发题解警示自己犯糖
一道思维题,推公式即可。
首先手玩一下样例发现 $ m=1$ ,\(m=2\) 均无法成功,直接输出。
如果大于2一定存在范围 \([L,R]\) 可以胜利。
对于最小值,不难想到对于完全图可以使 n 最小,且完全图的合法炸弹数一定小于一个m条边的 m 元环(在环内连接边一定不会更劣嘛)。
所以根据公式可知 \(n \times (n-1) \ge m\),暴力时间复杂度 \(O(Tn)\) 太劣了,考虑预处理 + 二分优化,时间复杂度\(O(Tlogn+n)\),比较优。
再考虑最大值,注意到对于一条边,让它的贡献最大必然是连接两个孤立点,这样它的贡献是两个点,发现连成链或者环每个边的贡献都不如它优,这样我们每一条边获得了两个点的贡献,同时会有一个炸弹合法,我们只能让m-1个炸弹合法,所以最大有 \(2 \times (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;
}
}

浙公网安备 33010602011771号