持久化

可持久化01Trie

旧街凉风 提交于 2019-11-29 19:22:30
完全等于可持久化动态开点线段树。 例题: Luogu P4735 最大异或和 建可持久化01Trie。 每次建一个新版本把序列的每个前缀和插进去。 添加操作亦如此。 查询的话就看每个数位取反的一侧在01Trie的这个区间内是否出现过(也就是 \(sum\) 是否相等),然后跳儿子。 #include<bits/stdc++.h> using namespace std; const int N=3e7; int read(){int x=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;} int n,m,cnt,root[N],son[N][2],d[31],sum[N];char s[3]; int Get(){scanf("%s",s);return s[0]=='A';} void split(int p) { int i,len=0; for(;p;d[++len]=p&1,p>>=1); for(i=len+1;i<=30;++i) d[i]=0; } void update(int &p,int pre) { sum[p=++cnt]=sum[pre]+1; for(int i=30,t=p;i;--i) son[t][d

可持久化并查集(草稿)

此生再无相见时 提交于 2019-11-29 13:37:59
#include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define LNF 0x3f3f3f3f3f3f3f3f #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define pqueue priority_queue #define NEW(a,b) memset(a,b,sizeof(a)) const double pi=4.0*atan(1.0); const double e=exp(1.0); const int maxn=4e5+8; typedef long long LL; typedef unsigned long long ULL; const LL mod=998244353; const ULL base=1e7+7; const int maxp=26+5; using namespace std; struct Pus{ struct node{ int l,r,fa,dep; }tr[maxn*30]; int root[maxn*30]; int cnt; void build(int &rt,int l,int r){ rt=++cnt; if(l==r)

企业模式之Unit Of Work模式

萝らか妹 提交于 2019-11-29 12:43:51
  在开始UnitOfWork模式之前有必要回顾下我们耳熟能详的Data Access Object(DAO)模式,即数据访问对象。DAO是一种简单的模式,我们构建应用的时候经常会使用到它,它的功能就是将DAL元素从应用程序中分离出来,在经典的三层架构中,我们会将数据持久化工作单独分离出来,封装成DAL层。但是,DAO并没有隐藏它面对是一张张数据表,而且通常情况我们会为数据库中的每一张表创建一个DAO类,想必大家对这种方式的极度的不爽了,。 由于DAO模式与数据表是一对一匹配的关系,因此DAO模式很好的配合了Active Record和Transaction Script业务模式,尤其是Table Module。正因为这种与数据表一对一匹配关系,使我对DAO模式深恶痛绝。   Unit Of Work模式,即工作单元,它是一种数据访问模式。它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。那它是怎么来维护的一系列业务对象组成的列表持久化工作的呢?通过事务。Unit Of Work模式 会记录所有对象模型修改过的信息,在提交的时候,一次性修改,并把结果同步到数据库。 这个过程通常被封装在事务中。所以在DAL中采用Unit Of Work模式好处就在于能够确保数据的完整性,如果在持有一系列业务对象(同属于一个事务

P4735 最大异或和 可持久化trie树

强颜欢笑 提交于 2019-11-29 10:01:45
可持久化01trie类似主席树思想 但是并不用作版本差 只需要再维护一个左端点的最大值即可 #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// const int N=2e6+10; int t[N<<5][2],Lmax[N<<5],ncnt,n,m,x,y,z,T[N],s[N]; char ss[2]; void upnode(int k,int i,int pre,int pos) { if(k<0){Lmax[pos]=i;return ;} bool c=(s[i]>>k)&1; if(pre)t[pos][c^1]=t[pre][c^1]; t[pos][c]=++ncnt; upnode(k-1,i,t[pre][c],t[pos]

luogu 3835 可持久化平衡树

梦想的初衷 提交于 2019-11-29 04:56:59
题目背景 本题为题目 普通平衡树 的可持久化加强版。 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数,如不存在输出-2147483647) 求x的后继(后继定义为大于x,且最小的数,如不存在输出2147483647) 和原本平衡树不同的一点是,每一次的任何操作都是基于某一个历史版本,同时生成一个新的版本。(操作3, 4, 5, 6即保持原版本无变化) 每个版本的编号即为操作的序号(版本0即为初始状态,空树) 输入格式 第一行包含一个正整数N,表示操作的总数。 接下来每行包含三个整数,第 i i 行记为 v_i, opt_i, x_i v i ​ , o p t i ​ , x i ​ 。 v_i v i ​ 表示基于的过去版本号( 0 \leq v_i < i 0 ≤ v i ​ < i ), opt_i o p t i ​ 表示操作的序号( 1 \leq opt \leq 6 1 ≤ o p t ≤ 6 ), x_i x i ​

luogu P5055 【模板】可持久化文艺平衡树

↘锁芯ラ 提交于 2019-11-29 04:56:48
题目背景 这是一道模板题。 题目描述 您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本): 在第 p p 个数后插入数 x x 。 删除第 p p 个数。 翻转区间 [l,r] [ l , r ],例如原序列是 \{5,4,3,2,1\} { 5 , 4 , 3 , 2 , 1 },翻转区间 [2,4] [ 2 , 4 ] 后,结果是 \{5,2,3,4,1\} { 5 , 2 , 3 , 4 , 1 }。 查询区间 [l,r] [ l , r ] 中所有数的和。 和原本平衡树不同的一点是,每一次的任何操作都是基于某一个历史版本,同时生成一个新的版本(操作 4 4即保持原版本无变化),新版本即编号为此次操作的序号。 本题强制在线。 输入格式 第一行包含一个正整数 N N,表示操作的总数。 接下来 N N 行,每行前两个整数 v_i,opt_i v i ​ , o p t i ​ , v_i v i ​ 表示基于的过去版本号 (0\le v_i<i) ( 0 ≤ v i ​ < i ), opt_i o p t i ​ 表示操作的序号 (1\le opt_i\le 4) ( 1 ≤ o p t i ​ ≤ 4 )。 若 opt_i=1 o p t i ​ = 1,则接下来两个整数 p_i,x_i p i ​ , x i ​ ,表示操作为在第 p_i

loj 120 可持久化序列

陌路散爱 提交于 2019-11-29 04:56:09
https://loj.ac/problem/120 这是一道模板题。 您需要维护一个序列,其中需要提供以下操作: 插入一个数到序列的第t 版本使其成为序列的第k 项,这个数为 x ; 删除序列的第t 版本的第x 项; 查询序列的第t 版本的第x 项。 第0 个版本为空序列。修改操作不会影响被修改的版本,而总是产生一个新版本。 fhq treap 注意split和merge的时候要新建节点。 1 #include<bits/stdc++.h> 2 using namespace std; 3 int const N=300000+10; 4 int val[N*20],sz[N*20],ch[N*20][2],rt[N],n,sum,cnt,key[N*20]; 5 void inline update(int x){ 6 sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1; 7 } 8 int inline mr(int v){ 9 int x=++cnt;val[x]=v;sz[x]=1;ch[x][0]=ch[x][1]=0;key[x]=rand(); return x; 10 } 11 void inline copy(int x,int y){ 12 val[x]=val[y]; ch[x][0]=ch[y][0];ch[x][1]=ch[y][1]

loj 6088 可持久化最长不降子序列

℡╲_俬逩灬. 提交于 2019-11-29 04:55:58
我们对最长不下降子序的单调序列进行维护,用可持久化平衡树来维护。 (ps我写的好像是主席树) 1 #include<bits/stdc++.h> 2 using namespace std; 3 int const N=500000+10; 4 int const M=N*20; 5 int rt[N],sz[M],mx[M],sum,n,ch[M][2]; 6 int find(int x,int l,int r,int v){ 7 if(l==r) return l; 8 int mid=(l+r)/2; 9 if(mx[ch[x][0]]>v) return find(ch[x][0],l,mid,v); 10 else return find(ch[x][1],mid+1,r,v); 11 } 12 void copy(int x,int y){ 13 sz[x]=sz[y];mx[x]=mx[y];ch[x][0]=ch[y][0];ch[x][1]=ch[y][1]; 14 } 15 void insert(int now,int &x,int l,int r,int p,int v){ 16 x=++sum; 17 copy(x,now); 18 if(l==r){ 19 sz[x]=1; mx[x]=v; return ; 20 } 21 int mid=(l+r)

Scrapy之持久化pipelines/items

喜欢而已 提交于 2019-11-29 00:46:35
基于上篇博文存在的问题    https://www.cnblogs.com/Alexephor/p/11432195.html      -无法完成爬虫刚开始 打开连接 爬虫关闭时:关闭连接   -分工不明确 本篇博文解决以上两问题   上篇博文不足之处主要体现在爬虫部分parse中在爬数据的过程操作了实时打开关闭文件处理,而且爬虫逻辑分工不明确   处理方式:1.在爬虫开始位置就打开文件操作或者数据库,在爬完之后就关闭掉即可        2.爬的数据应该交给process_item处理 Chouti.py 1 # -*- coding: utf-8 -*- 2 import scrapy 3 from wyb.items import WybItem 4 5 6 class ChoutiSpider(scrapy.Spider): 7 name = 'chouti' 8 # 爬取定向的网页 只允许这个域名的 9 allowed_domains = ['chouti.com'] 10 start_urls = ['http://chouti.com/'] 11 12 def parse(self, response): 13 from scrapy.http.response.html import HtmlResponse 14 # print(response, type

[BZOJ5338][TJOI2018]xor(可持久化Trie)

拈花ヽ惹草 提交于 2019-11-28 22:57:13
可持久化Trie模板题。 建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和。 或者树剖,不好写多少还多个log。 1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 #define For(i,x) for (int i=h[x],k; i; i=nxt[i]) 5 using namespace std; 6 7 const int N=100010; 8 int n,u,v,Q,x,y,z,op,nd,tim,cnt,t,a[N],rt1[N],rt2[N],fa[N][19]; 9 int h[N],to[N<<1],nxt[N<<1],L[N],R[N],dep[N],ch[N*64][2],d[N*64]; 10 11 void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } 12 13 void ins(int &x,int y,int k){ 14 int tmp=++nd; x=tmp; 15 for (int i=30; ~i; i--){ 16 ch[x][0]=ch[y][0]; ch[x][1]=ch[y][1]; d[x]=d[y