UOJ 218 UNR 1 火車管理

2022-05-11 01:00:10 字數 1402 閱讀 5515

注意記憶體有些卡,有一些技巧:

1.首先對於查詢的線段樹是全域性的,不需要動態開點

2.對於線段樹中的乙個節點 \(x\) ,如果它的左右兒子都沒有兒子,那麼下一次做區間覆蓋時,就不需要對 \(x\) 新建兩個節點

#include#define lo (o<<1)

#define ro (o<<1|1)

using namespace std;

const int n=5e5+10;

int n,m,ty,rt[n],a[n],tt=0;

struct data

}tr[n*130];

int t[n*4],la[n*4],in[n*130];

inline void pushdown(int o)

int ls=tr[o].ls,rs=tr[o].rs;

tr[ls].lag=t;tr[rs].lag=t;

}inline void push(int o,int l,int r)

inline void upd(int o)

inline int qry(int o,int l,int r,int sa,int se)

inline int qt(int x,int l,int r,int sa)

inline void add(int o,int l,int r,int sa,int se,int t)

push(o,l,r);

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

if(se<=mid)add(lo,l,mid,sa,se,t);

else if(sa>mid)add(ro,mid+1,r,sa,se,t);

else add(lo,l,mid,sa,mid,t),add(ro,mid+1,r,mid+1,se,t);

upd(o);

}inline void addtag(int &x,int l,int r,int sa,int se,int t)

pushdown(x);

int mid=(l+r)>>1;in[x]=1;

if(se<=mid)addtag(tr[x].ls,l,mid,sa,se,t);

else if(sa>mid)addtag(tr[x].rs,mid+1,r,sa,se,t);

else addtag(tr[x].ls,l,mid,sa,mid,t),addtag(tr[x].rs,mid+1,r,mid+1,se,t);

}int main()

else if(op==2)

} else if(op==3)

} return 0;

}

UOJ 218 UNR 1 火車管理

維護一顆主席樹 火車入棧相當於區間修改,彈棧相當於返回歷史版本 維護線段樹區間求和 ps 之前沒把 放上來 extra的最後乙個點re,orz蒟蒻無能為力 include include include include include const int maxn 600005 const int ...

uoj 218 UNR 1 火車管理

想了一下就想出了log 2的,之後剛了乙個下午嘗試去掉乙個log結果發現把set改成優先佇列就過了 log 2的自然做法 彈棧就單點查詢,把經過的所有區間內時間最大的彈掉,第二大的就是新的值 彈掉之後下傳,注意只需要下傳乙個標記,往下一共有log個區間 時間是log 2的,用優先佇列即可通過並且不是...

uoj218 火車管理 主席樹

維護乙個棧,每次區間壓棧,單點彈棧,區間詢問棧頂的元素和。如果沒有彈棧的操作的話,我們每一次只需要在一顆線段樹上面區間賦值即可。加上彈棧操作,我們每次就需要知道當前棧頂元素的上乙個元素是什麼,考慮用主席樹來維護每乙個時刻每乙個位置的最近一次的修改位置。假設當前的時間為x且我們需要彈棧,那麼我們需要先...