這道題是一道經典的平衡樹+啟發式合併吧。那麼考慮用可持久化線段樹來寫。
對每乙個節點儲存一棵線段樹表示所在塊的編號的集合(因此可以乙個塊值儲存一棵樹),然後合併的時候就地櫃合併左子節點和右子節點,然後更新節點的值即可。時空複雜度o(nlogn)
ac**如下:
#include#include#include#define n 100005
#define m 2000005
using namespace std;
int n,m,trtot,a[n],id[n],fa[n],rt[n],sum[m],ls[m],rs[m];
int read()
return x;
}void ins(int &k,int l,int r,int v)
int mid=(l+r)>>1;
if (v<=mid) ins(ls[k],l,mid,v); else ins(rs[k],mid+1,r,v);
sum[k]=sum[ls[k]]+sum[rs[k]];
}int merge(int x,int y)
int qry(int k,int rst)
else
} return id[l];
}int getfa(int x)
int main()
while (m--)
for (i=1; i<=n; i++) ins(rt[getfa(i)],1,n,a[i]);
m=read(); char ch;
while (m--)
} else printf("%d\n",qry(rt[getfa(x)],y));
} return 0;
}
by lych
2016.3.10
BZOJ 2733 永無鄉 線段樹合併
time limit 10 sec memory limit 128 mb submit 3624 solved 1937 submit status discuss 永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n ...
BZOJ2733 永無鄉 線段樹合併
永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n 來表示。某些島之間由巨大的橋連線,通過橋可以從乙個島 到達另乙個島。如果從島 a 出發經過若干座 含 0 座 橋可以到達島 b,則稱島 a 和島 b 是連 通的。現在有...
BZOJ2733 永無鄉 splay啟發式合併
作者部落格 永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n 來表示。某些島之間由巨大的橋連線,通過橋可以從乙個島 到達另乙個島。如果從島 a 出發經過若干座 含 0 座 橋可以到達島 b,則稱島 a 和島 b 是連 ...