首页 > 其他分享 >每日一题-24-06-17 (P10218)(加倍!)

每日一题-24-06-17 (P10218)(加倍!)

时间:2024-06-17 23:33:59浏览次数:12  
标签:24 06 17 int ll tr Mk id minb

看到异或直接想到线性基和trie

很明显是trie

从高到低一位位考虑,如果两个儿子都有,想使这一位为1,必须有一个变成加法

然后就便利一下trie,记录一下剩余的体力和最小的加法的数就好了

#include<bits/stdc++.h>
using namespace std;
#define ll __int128
#define ls tr[u][0]
#define rs tr[u][1]
ll read(){
	char ch=getchar();ll x=0;
	while(ch<'0' || ch>'9')ch=getchar();
	while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch-'0'),ch=getchar();
	return x;
}
void write(ll x){
	if(x>=10)write(x/10);
	putchar(x%10+'0');
}
int T,C,n,m,k,b[100005],tr[12000005][2],cnt;
ll res,a[100005],sumb[12000005],minb[12000005];
void init(){
	res=0;
	for(int i=1;i<=cnt;i++)tr[i][0]=tr[i][1]=sumb[i]=0,minb[i]=(ll)1<<120;
	cnt=1;
}
void insert(ll x,int y){
	int u=1;
	sumb[u]+=y;minb[u]=min(minb[u],x);
	for(int i=k-1;i>=0;i--){
		int p=(x>>i)&1;
		if(!tr[u][p])tr[u][p]=++cnt;
		u=tr[u][p];sumb[u]+=y;minb[u]=min(minb[u],x);
	}
}
void work(int u,int id,int la,ll s,ll x,ll miny){
	if(id==-1){
		res=max(res,s);
		return ;
	}
	ll Mk=(ll)1<<id,mk=Mk-1;
	if(!u){
		res=max(res,miny+(x|Mk|mk));
		return ;
	}
	bool flag=1;
	if(sumb[ls]<=la && (x|mk)+min(miny,minb[ls])>=(s|Mk))
		work(rs,id-1,la-sumb[ls],s|Mk,x,min(miny,minb[ls])),flag=0;
	if(sumb[rs]<=la && (x|Mk|mk)+min(miny,minb[rs])>=(s|Mk))
		work(ls,id-1,la-sumb[rs],s|Mk,x|Mk,min(miny,minb[rs])),flag=0;
	if(flag){
		work(ls,id-1,la,s,x,miny);
		work(rs,id-1,la,s,x|Mk,miny);
	}
	return ;
}
int main(){
	scanf("%d%d",&C,&T);
	memset(minb,0x7f,sizeof(minb));
	while(T--){
		scanf("%d%d%d",&n,&m,&k);
		init();
		for(int i=1;i<=n;i++)a[i]=read();
		for(int i=1;i<=n;i++)scanf("%d",&b[i]);
		for(int i=1;i<=n;i++)insert(a[i],b[i]);
//		for(int i=1;i<=cnt;i++)printf("(%d %d)\n",tr[i][0],tr[i][1]);
//		for(int i=1;i<=cnt;i++)write(sumb[i]),putchar(' ');puts("");
//		for(int i=1;i<=cnt;i++)write(minb[i]),putchar(' ');puts("");
		if(sumb[1]<=m){
			write(minb[1]+((ll)1<<k)-1);putchar('\n');
			continue;
		}
		work(1,k-1,m,0,0,(ll)1<<120);
		write(res);putchar('\n');
	}
	return 0;
}

本来想到了,但是以为那个work的枚举是 \(O(2^k)\) ,卡了半天(降智了)

标签:24,06,17,int,ll,tr,Mk,id,minb
From: https://www.cnblogs.com/kentsbk/p/18253434

相关文章

  • 2024.6.17鲜花/错误的号码
    XY星的星际新闻报一直不太畅销,所以报纸上会有一些广告,毕竟星际新闻局的非机器人员工也得吃饭。有一则广告是这样的:【数据删除】研学基地位于【数据删除】,该研学基地致力于让学生体验一个幻想纪前的生活并培养学生不借助现代高科技的群居生活能力。该研学基地将于幻想历元年六......
  • 【工作】2024年,计算机相关专业还值得选择吗?
    2024年,计算机相关专业还值得选择吗?随着2024年高考落幕,数百万高三学生又将面临人生中的重要抉择:选择大学专业。在这个关键节点,计算机相关专业是否仍是“万金油”的选择?在过去很长一段时间里,计算机科学与技术、人工智能、网络安全、软件工程等专业一直以来是炙手可热的存在,吸引......
  • 2024/6/9
    今天写数据库的实验五,使用Java写了一个十分简易的数据库,连输入都没有,只是证明我用Java连上了sqlserver,代码如下:importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;p......
  • 2024-06-17-Spring 源码阅读(三)Bean 的生命周期
    由于Spring源码非常多,博客中贴源码会占用大量篇幅,阅读困难。详细分析部分会以commit提交形式关联源码提交,画图例来说明源码整体逻辑。Bean生命周期主体逻辑相关代码:Bean的基本创建流程、lazyInit、循环依赖Bean对象创建基本流程通过最开始的关键时机点分析,我们知道Bean......
  • 2024/5/28
    今天开发安卓端的科技政策一点通,相比于web端有点复杂,边查资料边敲代码一直弄到十一点。部分代码packagecom.example.policy;importandroid.content.Intent;importandroid.os.Bundle;importandroid.text.Editable;importandroid.text.TextWatcher;importandroid.view......
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
    朋友们,阿星又来啦!今天,我要给你们带来一些低调但超级实用的APP推荐,让你们追书看漫画,从此不再书荒!追书大全:这个APP,简直是书迷的救星!不用花一分钱,就能畅游在数百万本小说的海洋里,轻松找到你的最爱。追书大全不仅支持漫画和小说,还能让你在阅读的时候远离广告和弹窗的干扰,让你完......
  • 【实用软件】Adobe Acrobat DC 2024最新版安装教程
    下载链接:https://r0vr8xquwul.feishu.cn/docx/PhBBdjSKZoeyFkxhO8Ucv7pEnph详细图文教程:https://www.yuque.com/zhefengerhuanzaigua/bld6x5/synrguy8okom8t97软件介绍AdobeAcrobat是由Adobe公司开发的一款PDF(PortableDocumentFormat,便携式文档格式)编辑软件。借助它,您可......
  • 20240617
    T1洛谷P10564RubbishSorting发现长度很小,考虑二进制枚举所有非匹配位。一个给定的字符串会构成一些模板,比如\(\texttt{abc}\)能产生模板\(\texttt{abc},\texttt{a_c},\texttt{ab_},\texttt{_bc},\texttt{a_},\texttt{_b},\texttt{a},\texttt{_}\)等。对于一个查询......
  • 持续总结中!2024年面试必问 20 道设计模式面试题(二)
    上一篇地址:持续总结中!2024年面试必问20道设计模式面试题(一)-CSDN博客三、请描述单例模式(SingletonPattern)及其使用场景。单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在软件系统中非常常见,因为它提供了一种控制实......
  • 每日一题-24-06-17 (P10217)
    今年省选题,考场上竟然没做出来今天似乎直接一眼出来了就是枚举下\(m\)模\(n\)的余数然后解个方程即可#include<bits/stdc++.h>usingnamespacestd;#definelllonglongintT,n,X,Y;intx[100005],y[100005];lls[100005],t[100005],res,k;llsub_down(llx,lly){......