UOJ UNR 1 火車管理

2022-09-16 22:15:22 字數 1271 閱讀 3686

題面考慮用可持久化線段樹直接維護每個點在不同時刻,第一輛車的編號。

這樣3操作就變成了區間賦值,1操作變成區間和

2操作的話,只需要查詢一下現在這輛車的編號,再到歷史版本去查一下上一輛車的編號就行了。

#include#include

#define mn 500000

using

namespace

std;

inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}int n,m,ty,rt[mn+5],cnt=0,num[mn+5

];struct

treet[mn*131

];inline

int newnode(int x,int flag=0)

inline

void mark(int x,int len,int v)

inline

void pushdown(int x,int lt,int

rt)int build(int l,int

r)int query(int x,int l,int r,int lt,int

rt)int query(int x,int k,int lt,int

rt)void modify(int x,int l,int r,int lt,int rt,int

v)

int mid=lt+rt>>1,flag=t[x].val;

if(t[x].val) pushdown(x,lt,rt);

if(r<=mid) modify(t[x].l=newnode(t[x].l,flag),l,r,lt,mid,v);

else

if(l>mid) modify(t[x].r=newnode(t[x].r,flag),l,r,mid+1

,rt,v);

else modify(t[x].l=newnode(t[x].l,flag),l,mid,lt,mid,v),

modify(t[x].r=newnode(t[x].r,flag),mid+1,r,mid+1

,rt,v);

t[x].sum=t[t[x].l].sum+t[t[x].r].sum;

}int last=0

;int

main()

if(op==2)

if(op==3)

}return0;

}

UOJ 218 UNR 1 火車管理

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

UOJ 218 UNR 1 火車管理

注意記憶體有些卡,有一些技巧 1.首先對於查詢的線段樹是全域性的,不需要動態開點 2.對於線段樹中的乙個節點 x 如果它的左右兒子都沒有兒子,那麼下一次做區間覆蓋時,就不需要對 x 新建兩個節點 include define lo o 1 define ro o 1 1 using namespac...

uoj 218 UNR 1 火車管理

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