這道題的每個詢問都有兩個區間,乙個是時間區間,乙個是商店編號區間。
每個購買也是和時間商店編號有關。
如何讓這兩個引數聯絡起來,就需要用到線段樹表示時間區間。線段樹可以把時間區間分細。對於每乙個詢問,它都有乙個時間區間[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異或的最大值。我們...