bzoj 3166 可持久化Tire】的更多相关文章

每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<set> #define N 50050 using namespace…
题意:给出\(a[1...n]\),找出一个连续区间\(a[l...r],r>l\),令该区间的次大值为\(a_k\),使得\(a_k⊕a_i,l≤i≤r\)最大,输出全局最优解 (这题意有点别扭) 异或这种套路,一般都是上trie,区间异或就加个可持久化 但问题是怎么找区间 不妨令每一个\(a_i\)为当前区间的次大值,那我们的目标就是尽可能找出该次大值的最远左右边界 令\(a_i\)从大到小插入,使用平衡树动态维护位置,那么\(pos_i\)的前驱和后继都是比\(a_i\)大的值的下标 假设…
题目链接 1295 XOR key 可持久化tire树模版题 数组一定要开够 不然数组不够的话就容易tle 吃了两次亏 #include<bits/stdc++.h> using namespace std; #define maxn 500000 #define LL long long struct ac{ LL sum,nex[]; void init(){ sum=; memset(nex,,sizeof(nex)); } }tre[maxn*]; LL tot,root[maxn];…
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持久化并查集 可持久化线段树+并查集+路径压缩+读入优化 */ #include <cstdio> #include <algorithm> using namespace std; ; int root_fa[Nmax]; inline int read() { ;char ch=ge…
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持久化并查集 可持久化线段树+并查集+按秩合并+读入优化 */ #include <cstdio> #include <algorithm> using namespace std; ; int root_fa[Nmax],root_rankk[Nmax]; inline int rea…
3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1227  Solved: 569[Submit][Status][Discuss] Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石有一个能量密度,记为ai,这些宝石的能量 密度两两不同.现在…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区间中任意一个数的结果的最大值.求区间权值的最大值. 分析: 考虑每个点作为区间次大的状态,发现对于每个点至多有两个最长区间其为次大值(为了让异或结果最大当然是区间越长越好,选择最多),用二分+静态RMQ算出这两个区间再在可持久化trie上面贪心即可. 论如何现场yy可持久化数据结构23333(基于可…
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By SiriusRen #include <set> #include <cstdio> #include <algorithm> using namespace std; #define N 50050 int n,cnt,f,ch[N*32][2],wei[N*32],root[N]…
题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左右离它最近第一个比$a_{i}$的位置$l1,r1$,再找出第二个比$a_{i}$大的位置$l2,r2$,这个可以用双向链表维护,保证$l1$和$r1$是$i$在链表里的$L_{i},R_{i}$ 那么$a_{i}$能作为次大值出现的区间为$[l2+1,r1-1]$和$[l1+1,r2-1]$ 把$…
链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,ans,cnt; int a[N],t[N*35],ch[N*35][2],pre[N],nxt[N],rt[N]; pair<int,int&…