持久化

BZOJ.5338.[TJOI2018]xor(可持久化Trie)

孤人 提交于 2019-11-28 22:56:59
BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的, 我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分。 注意求询问二的时候,为了方便就先算一下LCA的答案。 //83472kb 3316ms #include <cstdio> #include <cctype> #include <algorithm> #define BIT 29 #define gc() getchar() #define MAXIN 300000 //#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++) typedef long long LL; const int N=1e5+5; int Enum,H[N],nxt[N<<1],to[N<<1],A[N],root1[N],root2[N],dfn[N],R[N],sz[N],dep[N],fa[N],son[N],top[N]; char IN[MAXIN],*SS=IN,*TT=IN; struct Trie { #define S N*(BIT+2)//+2! int tot,sz[S],son[S][2]; void Insert(int x,int y,int v)

可持久化trie(BZOJ5338: [TJOI2018]xor)

别等时光非礼了梦想. 提交于 2019-11-28 22:56:44
题面 BZOJ Sol 显然是要维护一个区域的 \(trie\) 树,然后贪心 区间 \(trie\) 树??? 可持久化 \(trie\) 树??? 直接参考主席树表示出区间的方法建立 \(trie\) 树,然后做差就好了 巨简单 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; IL int Input(){ RG int x = 0, z = 1; RG char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1; for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48); return x * z; } const int maxn(1e5 + 5); const int pw(1 << 30); int n, q, first[maxn], cnt, val[maxn], dfn[maxn], idx, id[maxn]

BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】

妖精的绣舞 提交于 2019-11-28 22:56:29
题目分析:   很无聊的一道题目。首先区间内单点对应异或值的询问容易想到trie树。由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问。case2维护dfs序,对dfs序建可持久化的trie树。这样做的空间复杂度是O(nw),时间复杂度是O(nw). 代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=102000; 5 6 int n,q; 7 int v[maxn]; 8 vector<int> g[maxn]; 9 10 vector<pair<int,int> > qy[maxn]; 11 vector<pair<int,int> > vec; 12 13 int ans[maxn],num,kd[maxn]; 14 int dep[maxn],dfsin[maxn],dfsout[maxn],fa[maxn]; 15 16 vector<pair<int,int> > Lca[maxn]; 17 int pre[maxn]; 18 19 int found(int x){ 20 int rx = x; while(pre[rx] != rx) rx = pre[rx]; 21 while(pre[x] != rx){ 22 int t =

[loj6088]可持久化最长不降子序列

杀马特。学长 韩版系。学妹 提交于 2019-11-28 22:19:40
考虑二分求LIS的过程,就是维护一个序列,其中第i个数表示长度为i的最小结尾,而插入操作就是查找第一个大于x的位置并替换掉 用线段树维护,二分的过程也可以用线段树来完成,对线段树可持久化即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 500005 4 #define mid (l+r>>1) 5 int B,V,n,p,x,y,r[N],ans[N],f[N*30],ls[N*30],rs[N*30]; 6 int copy(int k){ 7 f[++V]=f[k]; 8 ls[V]=ls[k]; 9 rs[V]=rs[k]; 10 return V; 11 } 12 void build(int &k,int l,int r){ 13 f[k=++V]=0x3f3f3f3f; 14 if (l==r){ 15 if (!l)f[k]=-0x3f3f3f3f; 16 return; 17 } 18 build(ls[k],l,mid); 19 build(rs[k],mid+1,r); 20 f[k]=max(f[ls[k]],f[rs[k]]); 21 } 22 void update(int &k,int l,int r,int x,int y){ 23 k=copy(k); 24 if (l=

学习笔记:可持久化线段树(主席树):静态 + 动态

我们两清 提交于 2019-11-28 21:03:26
学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树。线段树分享可以看: @秦淮岸 、 @ZYzzz 、 @妄想の岚がそこに 树状数组。 \(BIT\) 分享可以看: @T-Sherlock 、 Chicago 、 @weishengkun 权值线段树:相当于将线段树当成一个 桶 ,其中的每一个点所代表的区间相当于 一段值域 。维护的值为这段值域中的一些信息。 例如该图,节点 \(2\) 代表的是值域为 \([1, 2]\) 的区间,节点 \(6\) 代表值域为 \([3, 4]\) 的区间... 可持久化概念: 可持久化实质上就是存储该数据结构 所有的历史状态 ,以达到高效的处理某些信息的目的。 静态区间第 \(k\) 小 抛出问题 题目链接 :给定长度为 \(N\) 的序列 \(A\) ,有 \(M\) 次询问,给定 \(l_i, r_i, k_i\) ,求在 \([l_i, r_i]\) 区间内第 \(k_i\) 小的数是多少。 \(N <= 10^5, M <= 10^4\) 先考虑如何求总序列第 \(k\) 小 我们可以建立一颗权值线段树,每个点存储的信息为 该值域区间存在的数的个数 。 因为线段树的性质,所以每个点的左子树的值域区间 $ <= $ 右子树的值域区间。 所以我们先看左子树区间有多少个数,记为 \(cnt_{left}\) 。 如果 \(k

P3835 【模板】可持久化平衡树

自作多情 提交于 2019-11-28 20:50:20
题面 https://www.luogu.org/problem/P3835 题解 #include<cstdio> #include<cstdlib> #include<iostream> #include<ctime> using namespace std; struct fhq_treap { int v[500050*50],fix[500050*50],ch[500050*50][2],siz[500050*50]; int root[500050],cnt; void clear() {cnt=0;} void copy(int x,int y) { v[y]=v[x]; fix[y]=fix[x]; ch[y][0]=ch[x][0]; ch[y][1]=ch[x][1]; siz[y]=siz[x]; } void update(int x) { siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1; } void split(int k,int x,int y,int &ch1,int &ch2) { if (!x) { ch2=ch1=0; return; } copy(x,y); if (v[y]<=k) { ch1=y; split(k,ch[y][1],++cnt,ch[y][1],ch2); } else { ch2=y;

RabbitMQ 简介

半腔热情 提交于 2019-11-28 19:19:13
前言 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。 本身支持很多的协议:AMQP, XMPP, SMTP, STONP RabbitMQ服务器是用Erlang语言编写的,实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。 此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等 主要特性 可伸缩性:集群服务 消息持久化:从内存持久化消息到硬盘,再从硬盘加载到内存 来源: https://www.cnblogs.com/loveer/p/11421987.html

Hibernate对象状态之间的神奇转换

跟風遠走 提交于 2019-11-28 15:01:34
状态分类 在Hibernate框架中,为了管理持久化类,Hibernate将其分为了三个状态: 瞬时态(Transient Object) 持久态(Persistent Object) 脱管态(Detached Object) 有很多人好像对这些概念和它们之间的转换不太明白,那么本篇文章就是来解决这些问题的,看完了还不会你来找我。(开个玩笑~~) 详细描述 我们先来详细地了解一下三种状态: 1、瞬时态 对象由new操作符创建,且尚未与Hibernate中的Session关联的对象被认为处于瞬时态。瞬时态对象不会被持久化到数据库中,也不会赋予持久化标识,如果程序中失去了瞬时态对象的引用,瞬时态对象将被垃圾回收机制销毁。 2、持久态 持久化实例在数据库中有对应的记录,并拥有一个持久化标识。持久化的实例可以是刚刚保存的,也可以是刚刚被加载的。无论哪一种,持久化对象都必须与指定的Session对象关联。 3、脱管态 某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象就变成脱管状态。脱管状态的引用引用依然有效,对象可继续被修改。如果重新让脱管对象与某个Session关联,该脱管对象会重新转换为持久化状态。 瞬时态 持久态 脱管态 是否存于Session缓存中 × √ × 数据库中是否有对应记录 × √ √ 例如: public class HibernateTest {

Sentinel-规则持久化-推模式(json文件)(六)

你说的曾经没有我的故事 提交于 2019-11-28 13:55:19
1.加依赖: <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-extension</artifactId> </dependency> 2.增加操作类(建议放在所有服务的公共包中): import com.alibaba.csp.sentinel.command.handler.ModifyParamFlowRulesCommandHandler; import com.alibaba.csp.sentinel.datasource.*; import com.alibaba.csp.sentinel.init.InitFunc; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; import com.alibaba.csp.sentinel.slots.block.degrade

可持久化数组学习

江枫思渺然 提交于 2019-11-28 09:44:50
可持久化数组的写法和主席树差不多,但是主席树的每一棵树的区间都不一样,而可持久化数组的每一棵树的区间都是一样的,剩下的写法就都差不多了; 附上代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mid ((l+r)>>1) using namespace std; const int N = 1e6+10; inline int read(){ int ref=0,x=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')x=-1;ch=getchar();} while(isdigit(ch)){ref=ref*10+ch-'0';ch=getchar();} return ref*x; } int n,m; int rt[N],val[N],tot; int a[N]; struct tree{ int val,ls,rs; }t[N<<4]; void build(int &x,int l,int r){ x=++tot; if(l==r){ t[x].val=a[l]; return ; } build(t[x].ls,l,mid); build(t[x].rs,mid+1,r); } void