官方题解

  • 题意:给数列a[],选择尽量多的数满足任意两个异或起来<=k

    1625D - Binary Spiders
  • 思路:首先,将数列排序得到,然后升序取得的值的任意两个最小值为相邻两个异或的最小值。

    证明:zxcv告诉我可以考虑在trie树上,dfs序等价于字典序,然后一个树与其lca最深(异或值最小)的叶子节点必是dfs序(字典序)最接近的,即相邻的,得证。

    这个结论非常有用!我们就可dp了。\(dp[i]=dp[j]+1\)满足\(a_i\ xor\ a_j>=k\)

    有了\(O(n^2)\)的,然后用上\(01trie树\)优化找与\(a_i\)异或值\(<=k\)。只需要\(O(30n)\)

    具体的(其实很好想:)

    k表示当前位K的值

    \(k=0\):只能找异或起来等于0的走

    \(k=1\):走异或为1的,然后用为0的子树更新\(dp[i]\)(这里我们要在trie树上维护子树的dp最大值)

    总之我们走的路径都表示该结果与k的前dep位相等。
  • code:
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int go[N*31][2],mx[N*31],pre[N],dp[N],n,k,ncnt;
struct node {int val,id;}a[N];
bool cmp(node u,node v) {return u.val<v.val;}
void Insert(int u,int d,int x) {
if(d<0) {mx[u]=x;return;}
bool w=(a[x].val>>d)&1;
if(!go[u][w]) go[u][w]=++ncnt;
Insert(go[u][w],d-1,x);
if(go[u][w^1])mx[u]=(dp[mx[go[u][0]]]>dp[mx[go[u][1]]])?mx[go[u][0]]:mx[go[u][1]];
else mx[u]=mx[go[u][w]];
}
int Fd(int x) {
int u=0,res=0;
for(int i=29;i>=0;i--) {
bool w=x&(1<<i),p=k&(1<<i);
if(p) {if(go[u][w^1])u=go[u][w^1];else return res;}
else {
int t1=go[u][w^1];if(t1&&dp[mx[t1]]>dp[res])res=mx[t1];
if(go[u][w])u=go[u][w];else return res;
}
}
if(dp[res]<dp[mx[u]]) res=mx[u];
return res;
}
int main() {
int ans=0,pos;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i].val),a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) {
pre[i]=Fd(a[i].val);dp[i]=dp[pre[i]]+1;
Insert(0,29,i);
if(dp[i]>ans)ans=dp[i],pos=i;
// printf("!%d %d\n",pre[i],dp[i]);
}
if(ans==1) printf("-1");
else {
printf("%d\n",ans);
for(int t=pos;t;t=pre[t]) printf("%d ",a[t].id);
}
return 0;
}

CF1625D - Binary Spiders[trie树优化dp]的更多相关文章

  1. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  2. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  3. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  4. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  5. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  6. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  7. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  8. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  9. CF833B-线段树优化DP

    CF833B-线段树优化DP 题意 将一个长为\(n\)的序列分成\(k\)段,每段贡献为其中不同数字的个数,求最大贡献和. 思路 此处感谢@gxy001 聚铑的精彩讲解 先考虑暴力DP,可以想到一个 ...

随机推荐

  1. 深入理解nodejs的异步IO与事件模块机制

    node为什么要使用异步I/O 异步I/O的技术方案:轮询技术 node的异步I/O nodejs事件环 一.node为什么要使用异步I/O 异步最先诞生于操作系统的底层,在底层系统中,异步通过信号量 ...

  2. 学生管理系统 C++课设

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> u ...

  3. 电机三环pid控制及调试经验

    一.伺服电机的双环pid 双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制. 两篇大佬的文章--这是我学习pi ...

  4. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...

  5. SpringMVC踩坑3——前后端传值问题

    在前端页面点击修改,同时把需要修改的ID传到后端,后端根据ID去修改具体数据 这是前端代码 <a href="${pageContext.request.contextPath}/bo ...

  6. HCIE笔记-第六节-CIDR与ICMP

    项目部 58人 地址:194.2.3.128 /26 研发部 100人 地址: 194.2.3.0/25 市场部 27人 地址: 194.2.3.192/27 财务部 15人 地址:194.2.3.2 ...

  7. Java语言学习day28--8月03日

    ###10接口作为方法参数与返回值 * A:  接口作为方法参数 接口作为方法参数的情况是很常见的,经常会碰到.当遇到方法参数为接口类型时,那么该方法要传入一个接口实现类对象.如下代码演示. //接 ...

  8. IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退

    大家在Debug程序的时候,是否遇到过因为"下一步"按太快,而导致跳过了想要深入分析的那段代码?是不是很想要有"回到上一步"这样的操作呢? 在IDEA中就提供了 ...

  9. 2021.08.01 P4311 数字序列(左偏树)

    2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...

  10. 共读《redis设计与实现》-单机(一)

    上一章我们讲了 redis 基本类型的数据结构 和 对象系统 ,这篇来说一下单机redis 的知识点. 一.数据库 一个数据库在redis中就有一个结构体,而数据库的结构体是由redisServer这 ...