SCOI2014 方伯伯的OJ

2021-08-18 22:07:14 字數 1921 閱讀 7652

資料範圍

n<=108

,m<=105

n

<=108

,m<=105

一眼平衡樹。5分鐘出思路,調了3小時。

我們不好直接維護排名的平衡樹,也不好直接維護編號的平衡樹。

那就建2

2

顆平衡樹,一棵以編號中序遍歷,一棵以排名中序遍歷,每個節點開pa

ir' role="presentation" style="position: relative;">pai

rpai

r記錄下這排名和編號。

然後對於每個操作 直接按照題意去修改就好了。把連續的區間縮成點用的時候再拆開。

注意以編號中序遍歷中 pa

irp ai

r的排名並不是真實排名而是相對排名,需要到另一棵樹中再查詢。 fi

ndsz

f in

dsz操作中如果要找的點被那段區間包含了 就直接強行 sp

lit spl

it拆開返回sz

s z。

#include

using namespace std;

const int maxn=1e6+5;

typedef pairpar;

#define mp make_pair

struct treap

inline void pushup(int p)

inline int newnode(int l,int r)

par split(int p,int

x) else

if(x>=size[l]+get(p))

x-=size[l];

int tem=rm[p];rm[p]=lm[p]+x-1;

if(rm[p]==lm[p])val[p]=mp(lm[p],lm[p]);

int pp=newnode(rm[p]+1,tem);

pp=merge(pp,r);rson[p]=0;

pushup(p);pushup(pp);

return mp(p,pp);

}int merge(int

x,int

y) if(!y)

if(prio[x]y])

lson[y]=merge(x,lson[y]);pushup(y);return

y; }

int split(int p,int v,int posp)

int findsz(int

x) else

}return sz;

}void debug(int p)

}t[2];

int n,m,minn=0,maxx;

int change(int

x,int

y)int up(int

x)int down(int

x)int query(int

x) else

if(ans+t[1].size[t[1].lson[p]]>=x)

p=t[1].lson[p];

else

else }}

}int main()

else

if(opt==2)

else

if(opt==3)

else

}return0;}

/*10101

211313

2537

28210

211314

21849

*/

SCOI2014 方伯伯的商場之旅

方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r。方伯伯要把位置在 l,r 中的每個人的石子都合併成一堆石...

SCOI2014 方伯伯的商場之旅

題目描述 方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合...

解題 SCOI 2014 方伯伯運椰子

題面 很有趣的一道題,看起來是個神奇網路流,其實我們只要知道網路的一些性質就可以做這道題了 因為題目要求流量守恆,所以我們其實是在網路中搬運流量,最終使得總費用減小,具體來說我們可以直接把這種 搬運 的關係建出來 對於一條從 u 到 v 的邊,從 u 向 v 連一條 b d 的邊,如果其上限不為零,...