題解 SDOI 2008 鬱悶的小J

2021-08-14 08:21:21 字數 2648 閱讀 4717

話說這題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...