专栏文章

题解:CF722D Generating Sets

CF722D题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqwl5ns
此快照首次捕获于
2025/12/04 11:55
3 个月前
此快照最后确认于
2025/12/04 11:55
3 个月前
查看原文
非常简单的贪心题目。
每一次找出最大的数,然后一直 xx2x \gets \lfloor \frac{x}{2}\rfloor,直到集合中不存在 xx,然后把 xx 插入到集合中。
当这样操作到 x=0x=0 时都无法插入,直接结束程序。
集合可以用 set 维护,时间复杂度:O(nlogV)O(n \log V),可以通过本题。
CPP
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define endl '\n'
#define pb push_back
#define ls(p) ((p)<<1)
#define rs(p) ((p)<<1|1)
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N=50005;
int a[N];
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	set<int> s;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		s.insert(a[i]);
	}
	while ("ljd loves xyq forever"){
		int x=(*(--s.end()));
		int num=x;
		while (x){
			if (!s.count(x)){
				s.erase(num);
				s.insert(x);
				break;
			}
			x>>=1;
		}
		if (x==0){
			s.insert(num);
			break;
		}
	}
	for (int x:s) cout<<x<<' ';
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...