CQOI2015 任務查詢系統(主席樹 差分)

2021-09-30 16:32:10 字數 1163 閱讀 3099

這是一道好題 可以更深的理解主席樹

最初的想法是 一開始 一邊加入任務 一邊維護時間軸

換句話說 對於每個時間點 我們都想維護一顆權值線段樹(這裡的權值代表著優先順序pi)相當於對於乙個任務 我們要維護ei-si棵

然而顯然mle 考慮降維

聯想到主席樹建樹方式是通過字首和來的

既然是求字首和 這道題的每個任務相當於區間修改 會不會與差分陣列有關呢?

答案是正確的

所以一開始我們想維護的ei-si棵權值線段樹 變成只維護ei,si+1這兩棵就行了 ei進行+1,si+1進行-1

因此我們按順序 rebuild這些權值線段樹 把他們合併成主席樹

然後就可以query了

#include#define int long long

#define n 100005

using namespace std;

int m,n,a[n],num,rt[n*100],tot,lson[n*100],rson[n*100],cnt[n*100],sum[n*100];

struct task

task[n];

inline void pushup(int now)

inline void build(int &now,int l,int r,int pos,int del)

int m=(l+r)>>1;

if(pos<=m) build(lson[now],l,m,pos,del);

else build(rson[now],m+1,r,pos,del);

pushup(now);

}inline int rebuild(int x,int y)

inline int query(int now,int l,int r,int k)

main()

sort(a+1,a+1+m);

++n;

num=unique(a+1,a+1+m)-a-1;

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)

int pre=1;

for(int i=1;i>x>>a>>b>>c;

k=1+(a*pre+b)%c;

pre=query(rt[x],1,num,k);

cout<

CQOI2015 任務查詢系統

因為對於任務來說,對一段區間是有用的,於是我們可以用差分來表示區間,然後主席樹維護字首區間和即可。然後因為我們是求和,我們同時主席樹也要維護區間的數字個數,因為求k小和。但是有可能當前區間的有a個相同的數字,我們求b個和,然後bac pragma gcc optimize 2 include def...

CQOI2015 任務查詢系統

主席樹維護k大,考慮到利用主席樹字首和的性質。把每個任務拆分成權值為1的進入操作,和權值為 1的退出操作 注意因為是閉區間,所以右邊的位置加進去的時候需要 1 應該是個動態開點的權值線段樹一樣的東西吧 維護v,表示該節點維護的任務數量是多少。sum表示該節點維護的任務總和是多少。輸出k大的時候 因為...

CQOI 2015 任務查詢系統

給定 m 個任務 l,r,p 其中 l,r 代表這個任務將於時間 l,r 內進行,而 p 代表的是這個任務的優先順序 有 n 個詢問 x,k 每次詢問在時間點 x 進行的所有任務按優先順序從小到大排序,前 k 個任務的優先順序之和 求前 k 個數的和,我們想到主席樹 區間覆蓋問題,我們想到差分 眾所...