#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. JMeter登录总是提示用户名不能为空的解决

    已传入参数了呀,还是提示用户名不能为空 解决: 将url拼接上参数 --

  2. Amazon RDS多区域高可用测试

    最近在AWS上面需要部署一组多区域RDS集群,AWS的多区域简单理解就是RDS一主一从分别在当地的两个机房(两个区域).所以就有了下面各方面的测试. 我们需要测试什么? Primary挂掉时,Seco ...

  3. AIX挂载NFS写入效率低效解决

    背景: Linux是NFS的Server端,AIX是NFS的Client端(此外,有一个Linux也作为Client端对比测试). 1.NFS对应的底层设备是闪存卡,本地测试I/O写性能可达2GB/s ...

  4. 读写App.config配置文件的方法

    我们经常会希望在程序中写入一些配置信息,例如版本号,以及数据库的连接字符串等.你可能知道在WinForm应用程序中可以利用Properties.Settings来进行类似的工作,但这些其实都利用了Ap ...

  5. jQuery-切换2

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. import caffe报错问题

    在搭建好的caffe环境下运行Python报错:ImportError:No module named _caffe 报错原因:由于caffe的Python环境变量未配置好 解决方案: 方法1 imp ...

  7. notepad使用列选

    列选有两种方法: 1.按住ALT + 鼠标从某点按住开始向下或向上拖动. 2.按住ALT+SHIFT+上下方向键. 列编辑: 1.ALT+C 2.插入相同文本还是自增数字

  8. 80x86的内存寻址机制

    80x86的内存寻址机制 80386处理器的工作模式: 模式. 模式之间可以相互转换,而模式之间不可以相互转换. DOS系统运行于实模式下,Windows系统运行与保护模式下. 实模式: 80386处 ...

  9. Yii2返回以主键id为键名的数组

    branch.php <?php namespace app\models; use Yii; /** * This is the model class for table "bra ...

  10. sitecore系统教程之架构概述

    Sitecore体验数据库(xDB)从实时大数据存储库中的所有通道源收集所有客户交互.它连接交互数据,为每个客户创建全面,统一的视图,并使营销人员可以使用数据来管理客户的实时体验. xDB架构非常灵活 ...