bzoj3600 沒有人的算術

2021-08-17 02:42:21 字數 2474 閱讀 3357

time limit: 20 sec  

memory limit: 128 mb

submit: 1118  

solved: 452 [

submit][

status][

discuss]

湖北省隊互測 week1

[ submit][

status][

discuss]

。。。。神。。神題。。。

具體過程太抽象了。。。我們考慮如果能有一種方法能快速得到排名那就方便多了

考慮用乙個平衡樹維護排名,

用實數表示排名,對於每乙個平衡樹上的節點,用這個節點的所屬實數區間的中位數作為排名;對於實數區間(根的實數區間自己定),對於右兒子,區間為(mid,r),左兒子區間為(l,mid)

每個節點在儲存實數排名的同時,也要儲存之前賦值的(l,r)(注意是儲存l、r,而不是l、r的實數排名)

然後插入時只需要做平衡樹的普通插入即可,

詢問用乙個線段樹維護,每個節點存最大值的下標(即答案)

對於平衡樹的選擇,因為實數區間要相對靜止,所以考慮用替罪羊樹

有乙個小技巧:可以維護乙個id陣列表示每個原陣列位置現在對應的是替罪羊樹上的哪個節點,從而來避免替罪羊樹的刪除操作(同時也是為了維護相對靜止),然後線段樹在比較的時候就是比較id的實數排名就好了

ps.我這個板子好像跑很快?

**:

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef double dl;

const int inf = 20011209;

const int maxn = 500010;

dl f[maxn];

struct data

bool operator == (const data &b) const

bool operator < (const data &b) const

bool operator > (const data &b) const

}val[maxn];

int n,m,rt,cnt;

int cur[maxn],id[maxn];

int siz[maxn],ch[maxn][2],tot;

int stk[maxn],now,p;

inline ll getint()

while (c >= '0' && c <= '9')

ret = ret * 10 + c - '0',c = getchar();

return ret * f;

}inline bool bal(int o)

inline void maintain(int o)

inline void dfs(int o)

inline void rebuild(int &o,int l,int r,dl xl,dl xr)

inline void rebuild(int &p,dl l,dl r)

inline int insert(int &o,dl l,dl r,data x)

if (x == val[o]) return o;

int d = x > val[o],ret = 0;

if (!d) ret = insert(ch[o][d],l,(l + r) / 2.0,x);

else ret = insert(ch[o][d],(l + r) / 2.0,r,x);

maintain(o);

if (!bal(o)) rebuild(o,l,r);

return ret;

}inline int idmax(int a,int b)

inline void update(int o,int l,int r,int pos)

int mid = l + r >> 1,lc = o << 1,rc = o << 1 | 1;

if (pos <= mid) update(lc,l,mid,pos);

else update(rc,mid + 1,r,pos);

id[o] = idmax(id[lc],id[rc]);

}inline int query(int o,int l,int r,int al,int ar)

inline char getcom()

int main()

; siz[tot] = 1;

f[0] = -1;

for (int i = 1; i <= n; i++) update(1,1,n,i);

for (int i = 1; i <= n; i++) cur[i] = 1;

for (int i = 1; i <= m; i++)

);update(1,1,n,k);

} return 0;

}

bzoj 3600 沒有人的算術 替罪羊樹

為什麼我沒有copy題面呢?看到題面你就懂了.hh 題意 定義乙個二元組 二元組的兩個元素可以是二元組 如 x,y 其中x可以是 a,b,c 之類的 定義二元組的比較方式 先比較左邊,左邊相同再比較右邊。遞迴比較可以用隨便哪顆平衡樹維護,70分 考慮對於每個 二元組,對他定義乙個實數的對映來表示它的...

3600 沒有人的算術

time limit 20 sec memory limit 128 mb submit 616 solved 280 submit status discuss 湖北省隊互測 week1 submit status discuss 可以發現,每時每刻新增的元素加入之前元素組成的集合中,新集合內的元...

3600 沒有人的算術

vfk太強了。題目大意 維護一段由集合組成的序列,集合分左右,支援合併操作,求區間內字典序最大的的位置。還有wjmzbmr的 重量平衡樹和字尾平衡樹在資訊學奧賽中的應用 好像是2013年的 思路大致是用平衡樹維護這些集合的相對大小,然後給它乙個實數值表示大小。用平衡樹查詢可以做到logn。最後再用線...