題解 SDOI 2008 鬱悶的小J

2021-08-14 08:26:42 字數 1932 閱讀 6123

話說這題bzoj上沒有,丟乙個洛谷的連線 點我

這題不是很難,對於每一種書建立乙個有序的位置陣列,就是這種書出現的位置集合,然後就是維護這個序列有序了

蒟蒻只能想到兩種:set和平衡樹,set就二分查詢,sbt就find

但這題最**的一點是卡空間!!!

蒟蒻的sbt結構體在資料極端情況下欲哭無淚

把裡面和外面的陣列改來改去都a不了

於是蒟蒻使出了渾身解數卡空間:

佇列**空間

vector動態陣列

剪除冗雜

而且是在結構體裡邊外邊都**空間,開上vector

最後發現直接用乙個大陣列維護森林即可

改來改去的**:

#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

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];

void up(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]=data[p]);

return ;

}int erase(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)

int a[n],z=0;

map mp;

queue

q;int main()

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

}return

0;}

題解 SDOI 2008 鬱悶的小J

話說這題bzoj上沒有,丟乙個洛谷的連線 點我 這題不是很難,對於每一種書建立乙個有序的位置陣列,就是這種書出現的位置集合,然後就是維護這個序列有序了 蒟蒻只能想到兩種 set和平衡樹,set就二分查詢,sbt就find 但mle!蒟蒻的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...