bzoj4537 Hnoi2016 最小公倍數

2022-08-22 21:21:12 字數 1081 閱讀 9015

傳送門:

思路:把邊按a排序,每sqrt(m)分一組

然後把詢問按b排序,把在這組及以前的邊按b排序

把這些邊用並查集一條一條插入並維護

零散的部分暴力插入並記錄,做完後暴力撤銷

注意:並查集不能路徑壓縮,否則無法撤銷回去

#include#include#include#include#includeconst int maxn=100010;

using namespace std;

int n,m,s,q,top,f[maxn],maxa[maxn],maxb[maxn],ans[maxn],opcnt,siz[maxn];

struct data

void print()

}e[maxn],q[maxn],stk[maxn];

struct operop[maxn];

bool operator <(data x,data y);

if (x==y)

f[x]=y,siz[y]+=siz[x];

maxa[y]=max(maxa[x],max(maxa[y],a));

maxb[y]=max(maxb[x],max(maxb[y],b));

}void goback()

opcnt=0;

}int main(){

scanf("%d%d",&n,&m),s=(int)sqrt(m);

for (int i=1;i<=m;i++) e[i].init(i);

sort(e+1,e+1+m);

//for (int i=1;i<=m;i++) e[i].print();

scanf("%d",&q);

for (int i=1;i<=q;i++) q[i].init(i);

sort(q+1,q+1+q,cmp);

//for (int i=1;i<=q;i++) q[i].print();

for (int i=1;i<=m;i+=s){

top=0;

for (int j=1;j<=q;j++)

if (q[j].a>=e[i].a&&(i+s>m||q[j].a

bzoj4537 HNOI2016 最小公倍數

time limit 40 sec memory limit 512 mb submit 563 solved 236 submit status discuss 給定一張n個頂點m條邊的無向圖 頂點編號為1,2,n 每條邊上帶有權值。所有權值都可以分解成2 a 3 b 的形式。現在有q個詢問,每次...

BZOJ4537 HNOI2016 最小公倍數

那個,事情是這樣的,從前有乙隻蒟蒻 對,就是我 然後有一天他心血來潮想創個部落格。可是沒過多久,他的熱情就過去了,甚至連一篇博文都沒有寫。然後,不知道怎麼了,他的部落格就被機房裡的dalao翻出來了,還被嘲諷了一番。於是他決定補救一下他的部落格。嗯,就這樣。這道題大概是這樣的。給定一張n個點m條邊的...

BZOJ4537 Hnoi2016 最小公倍數

給定一張n個頂點m條邊的無向圖 頂點編號為1,2,n 每條邊上帶有權值。所有權值都可以分解成2 a 3 b 的形式。現在有q個詢問,每次詢問給定四個引數u v a和b,請你求出是否存在一條頂點u到v之間的路徑,使得 路徑依次經過的邊上的權值的最小公倍數為2 a 3 b。注意 路徑可以不是簡單路徑。下...