CF1903D1 Maximum And Queries (easy version) 题解

Problem#

Solution#

考虑按位贪心。

简单计算发现 260>1018,所以我们从 60 倒着枚举。

对于每一位,我们发现要使最终答案的当前位为 1,则一定要保证所有数的当前位全部为 1,所以我们可以考虑要使所有数的当前位为 1 需要进行的操作数,再与 k 判断大小,若大则 k 减掉继续,若小则忽略当前位,最终计算最终结果(我们不需要全部使用 k 次操作)。

注意多定义几个数组临时存放数据。

Code#

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long

const int N=1e5+4;
int n,a[N],b[N],c[N];
void solve()
{
	int k;cin>>k;
	For(i,1,n)a[i]=b[i];
	FOR(w,60,0)
	{
		For(i,1,n)c[i]=a[i];
		int cnt=0;
		For(i,1,n)
		{
			if((a[i]>>w)%2==0)
			{
				int p=((a[i]>>w)+1)<<w;
				cnt+=p-a[i];
				a[i]=p;
			}
			if(cnt>k)break;
		}
		if(cnt<=k)k-=cnt;
		else For(i,1,n)a[i]=c[i];
	}
	int ans=a[1];
	For(i,2,n)ans&=a[i];
	cout<<ans<<"\n";
}
signed main()
{
	IOS;
	int q;cin>>n>>q;
	For(i,1,n)cin>>a[i],b[i]=c[i]=a[i];
	while(q--)solve();

	return 0;
}

作者:Wu-ZH

出处:https://www.cnblogs.com/Wu-ZH/p/18343984

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   ๑҉v  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu