【模板】可持久化線段樹

可持久化線段樹/主席樹:

顧名思義,該數據結構是可以訪問歷史版本的線段樹。用于解決需要查詢歷史信息的區間問題。

在功能與時間復雜度上與開n棵線段樹無異,然而空間復雜度從$O(n\times nlogn)$降到了$O(nlogn)$。

?

實現方法:

每次只更新有關的節點(每層一個,共$logn$個),其余節點不動。

用一個數組$rt[i]$記錄第$i$個版本線段樹的根節點(顯然每次必更新根節點)。

查詢時一路走下去,將兩個需要查詢的歷史版本的節點信息差分。

沒了。

?

模板題目:洛谷P3834

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;
#define MAXN 200005
#define MAXM 500005
#define INF 0x7fffffff
#define ll long longinline int read(){int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=x*10+c-'0';return x*f;
}int N,M,Q,A[MAXN],B[MAXN],tot,rt[MAXN];
int ls[MAXN*20],rs[MAXN*20],sum[MAXN*20];inline void build(int l,int r,int &k){k=++tot;if(l==r) return;int mid=l+r>>1;build(l,mid,ls[k]);build(mid+1,r,rs[k]);
}inline void update(int l,int r,int p,int las,int &k){k=++tot; sum[k]=sum[las]+1;ls[k]=ls[las],rs[k]=rs[las];if(l==r) return;int mid=l+r>>1;if(p<=mid) update(l,mid,p,ls[las],ls[k]);else update(mid+1,r,p,rs[las],rs[k]);
} inline int query(int l,int r,int s,int u,int v){if(l==r) return l;int mid=l+r>>1,x=sum[ls[v]]-sum[ls[u]];if(s<=x) return query(l,mid,s,ls[u],ls[v]);else return query(mid+1,r,s-x,rs[u],rs[v]); 
}int main(){N=read(),Q=read();for(int i=1;i<=N;i++) A[i]=read();memcpy(B,A,sizeof(A));sort(B+1,B+1+N);M=unique(B+1,B+1+N)-B-1;build(1,M,rt[0]);for(int i=1;i<=N;i++){int p=lower_bound(B+1,B+1+M,A[i])-B;update(1,M,p,rt[i-1],rt[i]);}while(Q--){int l=read(),r=read(),k=read();printf("%d\n",B[query(1,M,k,rt[l-1],rt[r])]);}return 0;
}

?

轉載于:https://www.cnblogs.com/YSFAC/p/10549131.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

skimage庫需要依賴 numpy+mkl 和scipy

skimage庫需要依賴 numpymkl 和scipy1、打開運行&#xff0c;輸入cmd回車&#xff0c;輸入python回車&#xff0c;查看python版本2、在https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 中&#xff0c;根據自己python版本下載需要的包 &#xff08;因為我的是python 2.7.13 …

操作系統04進程同步與通信

4.1 進程間的相互作用 4.1.1 進程間的聯系資源共享關系相互合作關系臨界資源應互斥訪問。臨界區&#xff1a;不論是硬件臨界資源&#xff0c;還是軟件臨界資源&#xff0c;多個進程必須互斥地對它們進行訪問。把在每個進程中訪問臨界資源的那段代碼稱為臨界資源區。顯然&#x…

oracle遷移到greenplum的方案

oracle數據庫是一種關系型數據庫管理系統&#xff0c;在數據庫領域一直處于領先的地位&#xff0c;適合于大型項目的開發&#xff1b;銀行、電信、電商、金融等各領域都大量使用Oracle數據庫。 greenplum是一款開源的分布式數據庫存儲解決方案&#xff0c;主要關注數據倉庫和BI…

CNN框架的搭建及各個參數的調節

本文代碼下載地址&#xff1a;我的github本文主要講解將CNN應用于人臉識別的流程&#xff0c;程序基于PythonnumpytheanoPIL開發&#xff0c;采用類似LeNet5的CNN模型&#xff0c;應用于olivettifaces人臉數據庫&#xff0c;實現人臉識別的功能&#xff0c;模型的誤差降到了5%以…

操作系統05死鎖

進程管理4--Deadlock and Starvation Concurrency: Deadlock and Starvation 內容提要 >產生死鎖與饑餓的原因 >解決死鎖的方法 >死鎖/同步的經典問題&#xff1a;哲學家進餐問題 Deadlock 系統的一種隨機性錯誤 Permanent blocking of a set of processes that eith…

CNN tensorflow 人臉識別

數據材料這是一個小型的人臉數據庫&#xff0c;一共有40個人&#xff0c;每個人有10張照片作為樣本數據。這些圖片都是黑白照片&#xff0c;意味著這些圖片都只有灰度0-255&#xff0c;沒有rgb三通道。于是我們需要對這張大圖片切分成一個個的小臉。整張圖片大小是1190 942&am…

數據結構01緒論

第一章緒論 1.1 什么是數據結構 數據結構是一門研究非數值計算的程序設計問題中&#xff0c;計算機的操作對象以及他們之間的關系和操作的學科。 面向過程程序數據結構算法 數據結構是介于數學、計算機硬件、計算機軟件三者之間的一門核心課程。 數據結構是程序設計、編譯…

css3動畫、2D與3D效果

1.兼容性 css3針對同一樣式在不同瀏覽器的兼容 需要在樣式屬性前加上內核前綴&#xff1b; 谷歌&#xff08;chrome&#xff09; -webkit-transition: Opera&#xff08;歐鵬&#xff09; -o-transition: Firefox&#xff08;火狐&#xff09; -moz-transition Ie -ms-tr…

ES6學習筆記(六)數組的擴展

1.擴展運算符 1.1含義 擴展運算符&#xff08;spread&#xff09;是三個點&#xff08;...&#xff09;。它好比 rest 參數的逆運算&#xff0c;將一個數組轉為用逗號分隔的參數序列。 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...doc…

數據結構02線性表

第二章 線性表 C中STL順序表&#xff1a;vector http://blog.csdn.net/weixin_37289816/article/details/54710677鏈表&#xff1a;list http://blog.csdn.net/weixin_37289816/article/details/54773406在數據元素的非空有限集中&#xff1a; (1)存在唯一一個被稱作“第…

訓練一個神經網絡 能讓她認得我

寫個神經網絡&#xff0c;讓她認得我(?????)(Tensorflow,opencv,dlib,cnn,人臉識別) 這段時間正在學習tensorflow的卷積神經網絡部分&#xff0c;為了對卷積神經網絡能夠有一個更深的了解&#xff0c;自己動手實現一個例程是比較好的方式&#xff0c;所以就選了一個這樣比…

數據結構03棧和隊列

第三章棧和隊列 STL棧&#xff1a;stack http://blog.csdn.net/weixin_37289816/article/details/54773495隊列&#xff1a;queue http://blog.csdn.net/weixin_37289816/article/details/54773581priority_queue http://blog.csdn.net/weixin_37289816/article/details/5477…

Java動態編譯執行

在某些情況下&#xff0c;我們需要動態生成java代碼&#xff0c;通過動態編譯&#xff0c;然后執行代碼。JAVA API提供了相應的工具&#xff08;JavaCompiler&#xff09;來實現動態編譯。下面我們通過一個簡單的例子介紹&#xff0c;如何通過JavaCompiler實現java代碼動態編譯…

樹莓派pwm驅動好盈電調及伺服電機

本文講述如何通過樹莓派的硬件PWM控制好盈電調來驅動RC車子的前進后退&#xff0c;以及如何驅動伺服電機來控制車子轉向。 1. 好盈電調簡介 車子上的電調型號為&#xff1a;WP-10BLS-A-RTR&#xff0c;在好盈官網并沒有搜到對應手冊&#xff0c;但找到一份通用RC競速車的電調使…

數據結構04串

第四章 串 STL&#xff1a;string http://blog.csdn.net/weixin_37289816/article/details/54716009計算機上非數值處理的對象基本上是字符串數據。 在不同類型的應用中&#xff0c;字符串具有不同的特點&#xff0c;要有效的實現字符串的處理&#xff0c;必須選用合適的存儲…

CAS單點登錄原理解析

CAS單點登錄原理解析 SSO英文全稱Single Sign On&#xff0c;單點登錄。SSO是在多個應用系統中&#xff0c;用戶只需要登錄一次就可以訪問所有相互信任的應用系統。CAS是一種基于http協議的B/S應用系統單點登錄實現方案&#xff0c;認識CAS之前首先要熟悉http協議、Session與Co…

JDK1.6版添加了新的ScriptEngine類,允許用戶直接執行js代碼。

JDK1.6版添加了新的ScriptEngine類&#xff0c;允許用戶直接執行js代碼。在Java中直接調用js代碼 不能調用瀏覽器中定義的js函數&#xff0c;會拋出異常提示ReferenceError: “alert” is not defined。[java] view plaincopypackage com.sinaapp.manjushri; import javax.sc…

數據結構05數組和廣義表

第五章 數組 和 廣義表 數組和廣義表可以看成是線性表在下述含義上的擴展&#xff1a;表中的數據元素本身也是一個數據結構。 5.1 數組的定義 n維數組中每個元素都受著n個關系的約束&#xff0c;每個元素都有一個直接后繼元素。 可以把二維數組看成是這樣一個定長線性表&…

k8s的ingress使用

ingress 可以配置一個入口來提供k8s上service從外部來訪問的url、負載平衡流量、終止SSL和提供基于名稱的虛擬主機。 配置ingress的yaml&#xff1a; 要求域名解析無誤 要求service對應的pod正常 一、test1.domain.com --> service1:8080 apiVersion: extensions/v1beta1…

JDK1.8中如何用ScriptEngine動態執行JS

JDK1.8中如何用ScriptEngine動態執行JS jdk1.6開始就提供了動態腳本語言諸如JavaScript動態的支持。這無疑是一個很好的功能&#xff0c;畢竟Java的語法不是適合成為動態語言。而JDK通過執行JavaScript腳本可以彌補這一不足。這也符合“Java虛擬機不僅僅是Java一種語言的虛擬機…