傳送門:
思路:把邊按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。注意 路徑可以不是簡單路徑。下...