洛谷 FJOI2015 火星商店問題

2021-10-08 20:25:18 字數 1281 閱讀 6252

初見安~這裡是傳送門:洛谷p4585 [fjoi2015]火星商店問題

聽說是分治線段樹套可持久化trie……蒟蒻不會分治線段樹,就寫了乙個線段樹套trie。

題意就是:n個初始為空的集合,m個操作。操作有:向某集合中加入乙個整數或查詢最近d次向編號在[l, r]中的集合加入的元素中,與x異或的最大值。

我們可以發現,對於詢問操作有乙個區間限制[l, r]和乙個時間限制最近d次,再加上求最大異或值。三層限制就不能單純用乙個可持久化資料結構了,要樹套樹。因為是求異或最大值,我們很容易想到01trie,這一層解決了。接下來是區間和時間限制。區間我們似乎可以用線段樹來框定。所以就是——開一棵線段樹,區間[l, r]表示區間內的集合,線段樹上每個點都開一棵01trie維護下方子節點內的資訊。最後的時間限制,我們在每乙個trie節點都記錄一下最近一次更新的時間,若在d之前則不繼續搜即可。

時間複雜度大概是線段樹上對應的葉子節點到根節點路徑上的所有點的01trie都要加入這個數。也就是說加入乙個數需要

上**——

#include#include#include#include#include#include#define maxn 40000007

using namespace std;

const int inf = 1e9;

typedef long long ll;

int read()

while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();

return x * f;

}int n, m, tot;

struct trie

} int ask(int p, int x, int d, int res)

return res;

}}t;

void insert(int p, int l, int r, int k, int x, int d)

int query(int p, int l, int r, int ls, int rs, int x, int d)

signed main()

return 0;

}

迎評:)

——end——

FJOI2015 火星商店問題

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

題解 FJOI2015火星商店問題

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

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

這道題的每個詢問都有兩個區間,乙個是時間區間,乙個是商店編號區間。每個購買也是和時間商店編號有關。如何讓這兩個引數聯絡起來,就需要用到線段樹表示時間區間。線段樹可以把時間區間分細。對於每乙個詢問,它都有乙個時間區間 cn t1 d 1,c nt1 cnt 1 d 1,cnt 1 cnt1 d 1 c...