#194. 「2019冬令营提高组」密文

设$s[i]$表示前$i$个密文的异或和

容易发现,只要知道$s[0]~s[n](s[0]=0)$就可以知道每一位的值。

转化一下,就变成了在完全图上求最小生成树,边权是$[l,r]$段的异或和

然鹅数据范围太大了......

但是边权是特殊的异或和!

于是我们用一棵trie维护边权,每次用贪心的思想

对于树上的某点,用最小的代价合并代表左右两个子树的连通块

合并时代价的计算直接暴力就好辣

可以证明每次的连通块数都减少一半

即复杂度为$O(nlognloga_{i})$

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
#define N 100005
#define M 3000005
int n,t,rt,u,a[N],ch[M][],le[M],ri[M],h[N];
long long ans;
void ins(int &x,int d,int i){
if(!x) x=++u;
if(i>=) ins(ch[x][(d>>i)&],d,i-);
}
int find(int x,int d,int i){
if(i<) return ;
int p=(d>>i)&;
return ch[x][p]?find(ch[x][p],d,i-):find(ch[x][p^],d,i-)+(<<i);
}
void dfs(int x,int d,int i){
if(i<){
h[++t]=d; le[x]=ri[x]=t;
return;
}le[x]=t+;
int lc=ch[x][],rc=ch[x][],L,R,mn=<<i;
if(lc) dfs(lc,d,i-);
if(rc) dfs(rc,d|(<<i),i-);
if(lc&&rc){
if(ri[lc]-le[lc]<ri[rc]-le[rc]) L=lc,R=rc;
else L=rc,R=lc;
for(int j=le[L];j<=ri[L];++j)
mn=min(mn,find(R,h[j],i-));
ans+=mn+(<<i);
}ri[x]=t;
} int main(){
freopen("secret.in","r",stdin);
freopen("secret.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;++i)
scanf("%d",&a[i]),a[i]^=a[i-];
for(int i=;i<=n;++i) ins(rt,a[i],);
dfs(rt,,); printf("%lld",ans);
return ;
}

fjwc2019 D6T2 密文(trie+贪心)的更多相关文章

  1. hdu 4825 Xor Sum(trie+贪心)

    hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...

  2. 假装有题目 & Trie+贪心

    题意: 从N个数中选出两个使其异或值最大. SOL: 建立一个01字典树,然后对每一个数在树上贪心即可...Trie一个挺好的运用,复杂度O(n*n的位数) CODE: #include <cs ...

  3. 2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)

    传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s ...

  4. 【CH1602】最大异或和 trie+贪心

    题目大意:给定 N 个数,求这 N 个数中任选两个数进行异或运算,求最大的异或和是多少. 一个 int 类型的整数,可以看作一个长度为32位的字符串,异或运算不像加法,最大值不一定是由两个较大值得到. ...

  5. 【CF706D】Vasiliy's Multiset Trie+贪心

    题目大意:需要维护一种数据结构,支持以下三种操作:插入一个数,删除一个数,查询该数据结构中的数异或给定数的最大值. 题解:如果没有删除操作就是一个标准的 Trie 上贪心求最大异或和问题.现在需要支持 ...

  6. [BZOJ4567][SCOI2016]背单词(Trie+贪心)

    1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小. 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某 ...

  7. 求序列完美度(trie+贪心)

    题目链接: 求序列完美度 题目描述 给出由n个数组成的序列s,规定第i个数s[i]到第j个数s[j]组成的子序列的完美度为该子序列中所有数的和与任意一个不在该子序列中的数进行异或运算得到的值中的最大值 ...

  8. [二进制trie][贪心]CSUOJ1216异或最大值

    题目传送门 过了好久,终于重新开始写博客了... 这是一道二进制trie树的模板题. 二进制trie树,理解一下就是一颗二叉树,左右儿子为0或1. 然后每插入一个数就进行一次Find操作. Find: ...

  9. [bzoj4567][Scoi2016]背单词-Trie+贪心+模型转化

    Brief Description 给你N个互不相同的字符串,记\(S_i\)为第i个字符串,现在要求你指定N个串的出现顺序,我们用\(V_i\)表示第i个字符串是第几个出现的,则V为1到N的一个排列 ...

随机推荐

  1. 合理利用配置不同的机器资源做redis cluster的server

    Redis cluster可以使用不同配置的机器学习因为我们可以手动调整不同的机器所承担的slot的个数,这样内存小CPU相对少的机器应该承担更少的slots

  2. Keras学习率调整

    Keras提供两种学习率适应方法,可通过回调函数实现. 1. LearningRateScheduler keras.callbacks.LearningRateScheduler(schedule) ...

  3. WebAssembly 浏览器中运行c/c++模块

    今天,要给前端造点儿福利 浏览器中能调用javascript,曾经我们以为够用了,够强大了,但是事实上是完全不够 还好,mozilla的工程师提出了webassembly,目前是利用emsctript ...

  4. node.js初识04

    node的Get表单提交 form.html <!DOCTYPE html> <html lang="en"> <head> <meta ...

  5. java.lang.NoClassDefFoundError: org/hibernate/QueryTimeoutException

    在做ssh整合的时候报错:java.lang.NoClassDefFoundError: org/hibernate/QueryTimeoutException org.springframework ...

  6. word之论文摘要

    字数在500个汉字左右

  7. jQuery选择器--#id、element和.class

       #id 描述 根据给定的ID匹配一个元素.使用任何的元字符作为名称的文本部分, 它必须被两个反斜杠转义:\\ 参数 id  用于搜索的,通过元素的 id 属性中给定的值 element 概述 根 ...

  8. 【Linux学习三】VI/VIM全屏文本编辑器

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.打开关闭文件打开文件:vim /path/to/somefilev ...

  9. java.security.NoSuchAlgorithmException: AES KeyGenerator not available

    异常信息 Caused by: Java.lang.IllegalStateException: Unable to acquire AES algorithm. This is required t ...

  10. Linux下实现免密登录

    过程如下: 1.Linux下生成密钥 通过命令”ssh-keygen -t rsa“ 2.1 通过ssh-copy-id的方式 命令: ssh-copy-id -i ~/.ssh/id_rsa.put ...