資料範圍
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 的邊,如果其上限不為零,...