uoj#370【UR #17】滑稽树上滑稽果
低智选手果然刷不动uoj
首先考虑一下构造一棵树显然是骗你玩的,按位与这个东西越做越小,挂到链的最下面显然不会劣于挂到之前的某一个点下面,所以我们只需要求一个排列使得答案最小就好了
设\(A=\max(a_i)\),发现最优答案不可能要劣于反复对一个数取\(\rm and\)的答案,我们就有了一个\(O(nA)\)的暴力,设\(dp_i\)表示当前的\(\rm and\)和为\(i\),把这个\(i\)变成\(0\)的最小代价
但是有可能最后的\(\rm and\)和也不是\(0\),于是我们把所有\(a_i\)都共有的二进制位\(k\)都求出来,在把每一个\(a_i\)消去这些数位,即和\(k\)异或一下,最后的\(\rm and\)和就一定为\(0\);在答案加上\(n\times k\)就好了
这样的话转移非常简单,我们枚举一个\(a_j\),\(dp_i=\min(dp_{i\ \rm and \ a_j }+i\ \rm and \ a_j)\)即可
最后答案是\(\min(dp_{a_i}+a_i)\)
注意到\(i\ \rm and \ a_j\)一定是\(i\)的子集,考虑枚举\(i\)的子集\(j\),现在只需要判断是否存在一个\(a_k\)满足\(i\ \rm and\ \ a_k=j\)
从集合的角度来考虑,我们可以把上面那个条件拆成\(j\)是\(a_k\)的子集,并且\(a_k\)是\(j\bigoplus i\)在全集补集中的子集,我们用\(\rm fwt\)处理一下就可以知道是否有一个\(a_k\)是\(i\bigoplus j\)在全集补集中的子集,但并没有办法判断\(j\)是否为\(a_k\)的子集
但是想一想发现我们没有必要判断\(j\)是否为\(a_k\)的子集,只管转移就好了
观察转移式\(dp_i=\min(dp_j+j)\),显然\(j\)越小越好,如过存在\(a_k\)是\(i\bigoplus j\)在全集补集中的子集,但是\(a_k\)并不是\(j\)的子集,那么一定会有一个更小的\(i\)的子集是这个\(a_k\)的子集,那个转移一定更优
于是复杂度就是\(O(3^{\log A})\)
#include<bits/stdc++.h>
#define re register
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e5+5;
int n,a[maxn],vis[1<<18+1],k,T,len;
LL dp[1<<18+1],ans;
int main() {
n=read();
for(re int i=1;i<=n;i++) a[i]=read(),T=max(T,a[i]);
len=1;while(len<T) len<<=1;len--;
for(re int i=1;i<=n;i++) vis[a[i]]=1;
for(re int i=2;i<=len+1;i<<=1)
for(re int ln=i>>1,l=0;l<len;l+=i)
for(re int x=l;x<l+ln;++x) vis[x+ln]|=vis[x];
k=a[1];for(re int i=2;i<=n;i++) k&=a[i];
for(re int i=1;i<=n;i++) a[i]^=k;
memset(dp,20,sizeof(dp));
ans=dp[0];dp[0]=0;
for(re int i=1;i<=T;i++)
for(re int j=i;j;j=(j-1)&i)
if(vis[len^j]&&dp[i^j]+(i^j)<dp[i]) dp[i]=dp[i^j]+(i^j);
for(re int i=1;i<=n;i++)
ans=min(ans,dp[a[i]]+a[i]);
printf("%lld\n",1ll*n*k+ans);
return 0;
}
uoj#370【UR #17】滑稽树上滑稽果的更多相关文章
- U68464 滑稽树上滑稽果(guo)
U68464 滑稽树上滑稽果(guo) 题目描述 小小迪有 n 个约会对象,每个对象有一个约会时长 p[i],小小迪 想尽可能多的去完成他的约会(假设小小迪可以瞬移),每个对象还有 一个忍耐时间 q[ ...
- UOJ#370. 【UR #17】滑稽树上滑稽果 动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ370.html 题解 首先易知答案肯定是一条链,因为挂在链的最下面肯定比挂在其他节点上赚. 问题被转化成了从一个集合中不断 ...
- UOJ#370. 【UR #17】滑稽树上滑稽果
$n \leq 1e5$个点,每个点有个权值$a_i \leq 2e5$.现将点连成树,每个点$i$的链接代价为$a_i \ \ and \ \ i父亲的代价$,这里的$and$是二进制按位与,求最小 ...
- 【做题】uoj#370滑稽树上滑稽果——巧妙dp
一个显然的结论是最终树的形态必然是一条链.具体证明只要考虑选定树上的某一条链,然后把其他部分全部接在它后面,这样答案一定不会变劣. 那么,一开始的想法是考虑每一位的最后出现位置,但这并不容易实现.注意 ...
- A. 【UR #17】滑稽树上滑稽果
题解: 首先很显然的是这是一条链(特殊数据说是链是故意让人迷茫的??) 然后 自己就开始yy 觉得每一次是加入一个使得当前值最小的数 然而这tm又是特殊数据?? 那就写一波发现是错的 考虑一下特殊数据 ...
- UOJ370 滑稽树上滑稽果 【状压DP】
题目分析: 答案肯定是链,否则可以把枝干放到主干. 去除一直存在的位,这样0位占满时就会结束. 用$f[S]$表示0位填埋情况,每次转移是它的一个子集,我们考虑可否转移. 再用$g[S]$存储转移是否 ...
- 吉首大学2019年程序设计竞赛(重现赛)I 滑稽树上滑稽果 (莫队+逆元打表)
链接:https://ac.nowcoder.com/acm/contest/992/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K ...
- 吉首大学校赛 I 滑稽树上滑稽果 (Lucas + 莫队)
链接:https://ac.nowcoder.com/acm/contest/925/I来源:牛客网 题目描述 n个不同的滑稽果中,每个滑稽果可取可不取,从所有方案数中选取一种,求选取的方案中滑稽果个 ...
- 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...
随机推荐
- thinkphp Widget扩展
Widget扩展一般用于页面组件的扩展.大理石平台规格 举个例子,我们在页面中实现一个分类显示的Widget,首先我们要定义一个Widget控制器层 CateWidget,如下: namespace ...
- 网站数据采集|埋点设计|nginx日志文件
数据获取的方式主要可以分为两种: 1.网站日志文件(log files) 页面埋点js自定义的采集. 优缺点: web服务器自带的日志记录功能:优点方便,缺点信息收集不全 自定义的js埋点收集:优点想 ...
- 牛客网 NOIP赛前集训营-普及组(第四场)C--部分和 (高维前缀和)
传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++ ...
- NX二次开发-UFUN高亮显示对象UF_DISP_set_highlight
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_disp.h> UF_initializ ...
- NX二次开发-UFUN输入表达式名称,获取它的名称和值UF_MODL_ask_exp
NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建一个新的表达式,有TAG tag_t ...
- OSI七层网络模型分别是哪七层?各运行那些协议?
本文摘自:https://blog.csdn.net/JeremyZJM/article/details/78184775 应用层 DHCP · DNS · FTP · Gopher · HTTP · ...
- 案例 查询QC(query_cache)
案例: 数据库版本 5.7.23 16c 64g 按月分区表,做压力测试 开启QC之前: select * from a where aa=xxx; QPS:每秒处理查询的数量 3000+ 开启之后 ...
- Intellij IDEA 撸码最头大的问题。。
想栈长我当初从 Eclipse 转用 IDEA 真是纠结,放弃然后尝试了N次,不过现在已经算是转型成功了,可以完全脱离 Eclipse 撸码了,虽然说我现在真的撸得非常少了.. 说到 IDEA 的痛点 ...
- CentOS7中下载MySQL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CentOS 7中,yum默认安装的是Mariadb,但我想使用MyS ...
- js添加节点
<!DOCTYPE html><html><body><script>var message=document.createTextNode(" ...