FJOI2015 火星商店問題 線段樹分治

2021-09-12 18:50:52 字數 2951 閱讀 8091

這道題的每個詢問都有兩個區間,乙個是時間區間,乙個是商店編號區間。

每個購買也是和時間商店編號有關。

如何讓這兩個引數聯絡起來,就需要用到線段樹表示時間區間。線段樹可以把時間區間分細。對於每乙個詢問,它都有乙個時間區間[cn

t1−d

+1,c

nt1]

[cnt_1-d+1,cnt_1]

[cnt1​

−d+1

,cnt

1​](t為當前詢問時間,d為詢問中向前延長的時間)都要放到線段樹上的節點上的vector中,用線段樹上vector儲存對應時間為[l,

r]

[l,r]

[l,r

]的詢問編號。

解決時,購買先按商店編號排序,以完成詢問中第二個區間變數。

線段樹分治,引數有now,tl,tr,l,r分別表示線段樹端點,購買操作tl,tr的時間是在l,r中,且tl,tr的編號有序。

#include

#define ls (now << 1)

#define rs (now << 1 | 1)

#define mid ((l + r) >> 1)

#define pb(x) push_back(x)

#define ll long long

using

namespace std;

inline

void

read

(int

&x)while

(ch >=

'0'&& ch <=

'9')

x *= f;

}inline

void

max(

int&x,

int y)

inline

void

min(

int&x,

int y)

const

int max =

0x7fffffff

;const

int min =

0x80000000

;const

int inf =

0x3f3f3f3f

;const

int n =

1e5+10;

int n, m, cnt1, cnt2, ans[n]

, rt[n]

;struct add

} q[n]

, tmp1[n]

, tmp2[n]

;inline

bool

cmp(add &a, add &b)

struct ask

} p[n]

;struct trie t[n <<5]

;int tot;

inline

void

insert

(int

&x,int y,

int w,

int now)

inline

intquery

(int x,

int y,

int w,

int now)

}trie;

vector<

int> ve[n]

;struct seg

if(tr <= mid)

modify

(ls, tl, tr, x, l, mid)

;else

if(tl > mid)

modify

(rs, tl, tr, x, mid +

1, r)

;else

modify

(ls, tl, mid, x, l, mid)

,modify

(rs, mid +

1, tr, x, mid +

1, r);}

int top, st[n]

;inline

intlow

(int x)

return r;

}inline

void

calc

(int now,

int tl,

int tr)

for(

int i =

0, sz = ve[now]

.size()

; i < sz; i++)}

//divide(線段樹上節點編號,[tl,tr]表示被時間[l,r]分成的q陣列上的購買時間)

//相當於是對每乙個購買時間進行分治,並用線段樹上的節點的vector來表示查詢問題

//線段樹作用只是用來儲存查詢問題,使購買和查詢擁有共同的時間段

inline

void

divide

(int now,

int tl,

int tr,

int l,

int r)

}seg;

intmain()

for(

int i =

1; i <= m; i++

)else

}for

(int i =

1; i <= cnt2; i++

) seg.

modify(1

, p[i]

.tl, p[i]

.tr, i,

1, cnt1)

;sort

(q +

1, q +

1+ cnt1, cmp)

; seg.

divide(1

,1, cnt1,

1, cnt1)

;for

(int i =

1; i <= cnt2; i++

)printf

("%d\n"

, ans[i]);

return0;

}

FJOI2015 火星商店問題

線段樹分治。以時間軸建立線段樹,每乙個線段樹節點,存放 l,r 時間內,有影響的操作1,建立可持久化trie樹,trie樹以商店位置為root,就可以支援商店的區間查詢,然後將操作0,按照商店位置排序,進行線段樹分治,每次到乙個節點,先把操作0插入trie樹,然後把所有當前時間記憶體的有影響的操作1...

題解 FJOI2015火星商店問題

好幾天之前做的題目了,一直想寫一下部落格也沒騰出時間來,今天趕緊把坑給填上呼呼呼 這道題首先如果只考慮每個商店中沒有時間限制的物品時,我們只需要使用一棵可持久化trie樹來維護區間內的異或最大值即可,這樣我們可以把兩部分的問題分離開來。之後我們再考慮有時間限制與編號限制的情況下,該怎樣做?無腦做法線...

洛谷 FJOI2015 火星商店問題

初見安 這裡是傳送門 洛谷p4585 fjoi2015 火星商店問題 聽說是分治線段樹套可持久化trie 蒟蒻不會分治線段樹,就寫了乙個線段樹套trie。題意就是 n個初始為空的集合,m個操作。操作有 向某集合中加入乙個整數或查詢最近d次向編號在 l,r 中的集合加入的元素中,與x異或的最大值。我們...