話說這題bzoj上沒有,丟乙個洛谷的連線 點我
這題不是很難,對於每一種書建立乙個有序的位置陣列,就是這種書出現的位置集合,然後就是維護這個序列有序了
蒟蒻只能想到兩種:set和平衡樹,set就二分查詢,sbt就find
但mle!!!
蒟蒻的sbt結構體在資料極端情況下欲哭無淚
把裡面和外面的陣列改來改去都a不了
於是蒟蒻使出了渾身解數卡空間:
佇列**空間
樹上分治
開上vector
最後還是mle
後來發現只要在乙個序列上種多棵sbt就行了
**
#include
using
namespace std;
#define rg register
#define cl(x) memset(x,0,sizeof(x))
#define clm(x) memset(x,0x7fffffff,sizeof(x))
#define oo 0x7fffffff
#define l ch[p][0]
#define r ch[p][1]
#define ll ch[ch[p][0]][0]
#define lr ch[ch[p][0]][1]
#define rl ch[ch[p][1]][0]
#define rr ch[ch[p][1]][1]
template
<
typename _tp>
inline
void
read
(_tp&x)
while
(isdigit
(c11))if
(booo)x=
-x;return;}
const
int limit1=
100001
;const
int limit2=50;
const
int n=
500000
;int sz;
int data[n]
,ch[n][2
],size[n]
,rt[n]
;voidup(
int p)
void
clear()
void
zig(
int&p)
void
zag(
int&p)
void
maintain
(int
&p,bool flag)
else
return
;else
if(size[rr]
>size[l]
)zig
(p);
else
if(size[rl]
>size[l]
)else
return
;maintain
(l,0);
maintain
(r,1);
maintain
(p,0);
maintain
(p,1);
return;}
void
ins(
int&p,
int x)
if(data[p]
==x)
return
;++size[p]
;ins
(ch[p]
[data[p]
,x);
up(p)
;maintain
(p,x>=data[p]);
return;}
interase
(int
&p,int x)
tmp=
erase
(ch[p]
[data[p]
<=x]
,x);
return tmp;
}int
rank
(int t,
int x)
}return tmp;
}int
build
(int l,
int r)
//vector t;
int a[n]
,z=0
;map <
int,
int> mp;
queue <
int> q;
intmain()
ins(rt[tmp]
,i);
}char c[3]
;int l,r,x;
while
(m--
)printf
("%d\n"
,rank
(rt[p]
,r)-
rank
(rt[p]
,l-1))
;}else*/}
erase
(rt[p1]
,l);
//if(t[p1].rt==0)q.push(p1);
ins(rt[p2]
,l);a[l]
=r;}
}return0;
}
題解 SDOI 2008 鬱悶的小J
話說這題bzoj上沒有,丟乙個洛谷的連線 點我 這題不是很難,對於每一種書建立乙個有序的位置陣列,就是這種書出現的位置集合,然後就是維護這個序列有序了 蒟蒻只能想到兩種 set和平衡樹,set就二分查詢,sbt就find 但這題最 的一點是卡空間!蒟蒻的sbt結構體在資料極端情況下欲哭無淚 把裡面和...
SDOI2008 鬱悶的小J
傳送門 看到過一些神仙做法 離線二維偏序雜湊做 然而我並沒有想那麼多 管他那麼多,上個map map map 樹狀陣列10mi na 10mina 10mina 掉直接對於每一種數都維護乙個map mapma p 取下來就直接單點先減再加,維護一下每個位置放的什麼書就可以了 但l uo gu luo...
SDOI2008 石子合併 題解
題面 garsiawachs演算法專門解決石子合併問題 設乙個序列是a 0.n 1 每次尋找最小的乙個滿足a k 1 a k 1 的k,那麼我們就把a k 與a k 1 合併,並向前尋找乙個第乙個超過他們的和的數,把這個數插入到他後面 include define inc i,a,b for reg...