#trie#洛谷 4098 JZOJ 3226 ALO

2024-02-11 05:18
文章标签 洛谷 jzoj trie alo 4098 3226

本文主要是介绍#trie#洛谷 4098 JZOJ 3226 ALO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


分析

首先肯定会想到建一棵可持久化01trie,但是关键是次大值,所以考虑从小到大排序,那么每次该数都会有一段选择的区间,那么考虑把它合并给左右,用该值当次大值在trie中找到区间中最大的一个,其实这道题实际操作比理论还要难,至少我是这么认为的


代码

#include <cstdio>
#include <cctype>
#include <deque>
#include <algorithm>
#define rr register
using namespace std;
const int INF=2e9+11,N=50011; pair<int,int>b[N];
int l[N],r[N],a[N],n,cnt,root[N],ans;
inline signed iut(){rr int ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
struct I_AC_the_Task{int son[N*31],tr[N*31][2],tot;inline void Insert(int x){rr int rt=root[cnt];root[++cnt]=++tot;for (rr int i=29;~i;--i){rr int p=(x>>i)&1;son[tot]=son[rt]+1;tr[tot][p]=tot+1;tr[tot][p^1]=tr[rt][p^1];rt=tr[rt][p],++tot;}son[tot]=son[rt]+1;}inline signed query(int l,int r,int x){rr int ls=root[l],rs=root[r],ans=0;for (rr int i=29;~i;--i){rr int p=(x>>i)&1;if (son[tr[ls][p^1]]<son[tr[rs][p^1]])ls=tr[ls][p^1],rs=tr[rs][p^1],ans|=1<<i;else ls=tr[ls][p],rs=tr[rs][p]; }return ans;}
}trie;
inline signed max(int a,int b){return a>b?a:b;}
signed main(){n=iut(); a[0]=a[n+1]=INF; r[0]=1,l[n+1]=n; trie.tot=0;for (rr int i=1;i<=n;++i) a[i]=iut(),l[i]=i-1,r[i]=i+1;for (rr int i=1;i<=n;++i) b[i]=make_pair(a[i],i),trie.Insert(a[i]);sort(b+1,b+1+n);for (rr int i=1;i<=n;++i){rr int pos=b[i].second,L=l[pos],R=r[pos]; l[R]=L,r[L]=R;if (L>=1) ans=max(ans,trie.query(l[L],R-1,a[pos]));if (R<=n) ans=max(ans,trie.query(L,r[R]-1,a[pos]));}return !printf("%d",ans);
} 

这篇关于#trie#洛谷 4098 JZOJ 3226 ALO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698922

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

Python高效实现Trie(前缀树)及其插入和查找操作

Python高效实现Trie(前缀树)及其插入和查找操作 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。Trie(前缀树)是一种高效的数据结构,广泛应用于字符串处理、自动补全、拼写检查等场景。本文将详细介绍如何实现一个Trie,并提供插入和查找操作,确保代码实用性强,条理清晰,操作性强。 1. 引言 Trie(前缀树)是一种树形数据结构,

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

Trie 类型的题目总结

trie字典树可以用来查找单词或者搜索剪枝用。 Implement Trie (Prefix Tree) 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法。(模板必须记住;没有儿子建立儿子,有儿子走儿子;) class Trie {private class TrieNode {public TrieNode[] children;public b

Jzoj 条件循环(while,do while) 部分代码(共25题)

1020: 【入门】编程求1+3+5+...+n #include <bits/stdc++.h>using namespace std;int n, sum;int main() {scanf("%d", &n);for(int i=1; i<=n; i+=2){sum+=i;} printf("%d", sum);return 0;} 1012: 【入门】两数比大小 #i

Jzoj 二维数组部分代码(共13题)

2788: 【入门】二维数组的输入输出 边输入边输出 #include <bits/stdc++.h>using namespace std;int n, m, a[11][11];int main(){scanf("%d %d", &n, &m);//边输入边输出for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){scanf("%d", &

【Trie树】模板题-POJ-2001

题意: 给你若干个单词,写出能每个单词的最短前缀 也就是说这个前缀能准确代表这个单词,和其他单词 without ambiguity  思路: 建立字典树存下这几个单词,ct 数组记录每个节点的子节点数,显然子树宽度只有1的话,这个单词就被确定了,改造一下我们的 find_word 函数就行啦 哦。。这个结构体要怎么搞还坑了我一下,要向下面那样定义! 代码: #include