N
I
B
O
R

洛谷月赛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;
	}
}
posted @ 2025-10-01 22:11  TTC_84  阅读(22)  评论(0)    收藏  举报