#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. 开启Laravel之旅的标准姿势

    1.github下载最新的laravel https://github.com/laravel/laravel 2.下载到本地,改名,composer install,安装项目的依赖包 compose ...

  2. [Java in NetBeans] Lesson 09. Switch / If-Else Ladder

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: 1. Nested If-else statement (if-else ladder) /** * 90 and above == ...

  3. Reported time is too far out of sync with master. Time difference of 52692ms > max allowed of 30000ms

    RegionServer与Master的时间不一致造成的.由错误内容可以看出两台机器之间最大的误差时间为30000ms,一旦超过这个值便无法启动. 解决办法:同步RegionServer与Master ...

  4. iOS 上传自己的库到cocoapod

    最近自己写了个库,传到github上,想让自己的库支持cocoapod,这里我看了很多相关文章.下面我就写下详细步骤以及会遇到的问题. 我们会使用trunk的方式提交到cocoa pod 这是2014 ...

  5. iOS UIViewController生命周期控制

    具体流程,看下图: init方法在init方法中实例化必要的对象(遵从LazyLoad思想)init方法中初始化ViewController本身 loadView方法当view需要被展示而它却是nil ...

  6. C# 深拷贝和浅拷贝

    在编码中.经常会遇到赋值操作.值类型就不说了.如果是引用类型赋值.其实是引用传递,即赋值的是一个引用.比如: Person p1 = new Person("张三", " ...

  7. Unity中HideInInspector和SerializeField以及Serializable

    首先,Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来. 然后是,什么样的值会被显示在面板上? 已经被序列 ...

  8. SWF加载器控件 SWFLoaderControl

    SWF加载器控件 书:165 <?xml version="1.0" encoding="utf-8"?> <s:Application xm ...

  9. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  10. html5-常用的文本元素

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...