線段樹分治。以時間軸建立線段樹,每乙個線段樹節點,存放[l,r]時間內,有影響的操作1,建立可持久化trie樹,trie樹以商店位置為root,就可以支援商店的區間查詢,然後將操作0,按照商店位置排序,進行線段樹分治,每次到乙個節點,先把操作0插入trie樹,然後把所有當前時間記憶體的有影響的操作1全部拿出來,進行查詢即可。
#include#include#include#include#include#include#include#include#include#include#include#include//#include#include#include #pragma gcc optimize(2)
#define up(i,a,b) for(int i=a;ib;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
while (ch >= '0' && ch <= '9')
return x * f;
}typedef pairpir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
const int n = 1e5 + 10;
struct trie
void insert(int &o, int pre, int x,int pos)
int query(int l, int r, int x, int pos)
else return query(ch[l][f], ch[r][f], x, pos - 1);
}}t;
int n, m;
int node_cnt, day;
struct node nd[n];
struct shop
}sp[n];
int ans[n];
struct tree
int mid = (l + r) >> 1;
if (l <= mid)update(lson, l, r, id);
if (r > mid)update(rson,l, r, id);
} void cal(int l, int r, int root)
for (auto k : tr[root])
}void div(int l, int r,int root, int l, int r)
up(i, 0, t1.size())sp[l + i] = t1[i];
up(i, 0, t2.size())sp[l + t1.size() + i] = t2[i];
div(lson, l, l + t1.size() - 1);
div(rson, l + t1.size(), r);
}}seg;
int main()
int op, l, r, x, d;
while (m--) ;
ans[node_cnt] = t.query(t.root[l - 1], t.root[r], x, 20);
} else ;
} }sort(sp + 1, sp + day + 1);
upd(i, 1, node_cnt)
seg.update(1, day, 1, nd[i].st, nd[i].ed, nd[i].id);
seg.div(1, day, 1, 1, day);
upd(i, 1, node_cnt)
return 0;
}
題解 FJOI2015火星商店問題
好幾天之前做的題目了,一直想寫一下部落格也沒騰出時間來,今天趕緊把坑給填上呼呼呼 這道題首先如果只考慮每個商店中沒有時間限制的物品時,我們只需要使用一棵可持久化trie樹來維護區間內的異或最大值即可,這樣我們可以把兩部分的問題分離開來。之後我們再考慮有時間限制與編號限制的情況下,該怎樣做?無腦做法線...
洛谷 FJOI2015 火星商店問題
初見安 這裡是傳送門 洛谷p4585 fjoi2015 火星商店問題 聽說是分治線段樹套可持久化trie 蒟蒻不會分治線段樹,就寫了乙個線段樹套trie。題意就是 n個初始為空的集合,m個操作。操作有 向某集合中加入乙個整數或查詢最近d次向編號在 l,r 中的集合加入的元素中,與x異或的最大值。我們...
FJOI2015 火星商店問題 線段樹分治
這道題的每個詢問都有兩個區間,乙個是時間區間,乙個是商店編號區間。每個購買也是和時間商店編號有關。如何讓這兩個引數聯絡起來,就需要用到線段樹表示時間區間。線段樹可以把時間區間分細。對於每乙個詢問,它都有乙個時間區間 cn t1 d 1,c nt1 cnt 1 d 1,cnt 1 cnt1 d 1 c...