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