日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

發布時間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4537: [Hnoi2016]最小公倍數

Time Limit:?40 Sec??Memory Limit:?512 MB
Submit:?1474??Solved:?521
[Submit][Status][Discuss]

Description

  給定一張N個頂點M條邊的無向圖(頂點編號為1,2,…,n),每條邊上帶有權值。所有權值都可以分解成2^a*3^b
的形式。現在有q個詢問,每次詢問給定四個參數u、v、a和b,請你求出是否存在一條頂點u到v之間的路徑,使得
路徑依次經過的邊上的權值的最小公倍數為2^a*3^b。注意:路徑可以不是簡單路徑。下面是一些可能有用的定義
:最小公倍數:K個數a1,a2,…,ak的最小公倍數是能被每個ai整除的最小正整數。路徑:路徑P:P1,P2,…,Pk是頂
點序列,滿足對于任意1<=i<k,節點Pi和Pi+1之間都有邊相連。簡單路徑:如果路徑P:P1,P2,…,Pk中,對于任意1
<=s≠t<=k都有Ps≠Pt,那么稱路徑為簡單路徑。

Input

  輸入文件的第一行包含兩個整數N和M,分別代表圖的頂點數和邊數。接下來M行,每行包含四個整數u、v、a、
b代表一條頂點u和v之間、權值為2^a*3^b的邊。接下來一行包含一個整數q,代表詢問數。接下來q行,每行包含四
個整數u、v、a和b,代表一次詢問。詢問內容請參見問題描述。1<=n,q<=50000、1<=m<=100000、0<=a,b<=10^9

Output

  對于每次詢問,如果存在滿足條件的路徑,則輸出一行Yes,否則輸出一行 No(注意:第一個字母大寫,其余
字母小寫) 。

Sample Input

4 5
1 2 1 3
1 3 1 2
1 4 2 1
2 4 3 2
3 4 2 2
5
1 4 3 3
4 2 2 3
1 3 2 2
2 3 2 2
1 3 4 4

Sample Output

Yes
Yes
Yes
No
No

HINT

Source

?

考慮暴力做法,對于每一個詢問,暴力加入滿足詢問的邊,然后維護聯通性和maxpmaxqmaxp,maxq,如果滿足條件則YesYes。?
兩個條件的限制似乎很難用別的數據結構優化掉,那么考慮分塊,先以pp為第一關鍵字,qq為第二關鍵字排序,每$m^{0.5}$分成一塊。然后把每一個詢問歸類到相應的塊中,使得這個詢問的$p$大于等于塊的$p$最小值小于等于最大值。?
依次掃每個塊,把每個塊的詢問取出來。設當前的塊號是$i$,那么我們把$1$到$i-1$的塊里面的所有的邊按$b$排序,

再把這個塊內的詢問按$q$排序。然后掃$1$到$i-1$的符合當前詢問的邊,加入并查集。對于i塊內的邊,只能暴力掃然后加入并查集了,注意處理完這個詢問后,要撤銷掉在該塊內加入的邊。

所以此題的并查集不能路徑壓縮,要用啟發式合并或按秩合并,兩者都是$logn$的,總的時間復雜度時$O(n^{1.5}logn)$。

將代碼中的啟發式換成按秩合并可AC否則TLE

1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #define ll long long 8 #define maxn 140105 9 using namespace std; 10 int read() { 11 int x=0,f=1;char ch=getchar(); 12 for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; 13 for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; 14 return x*f; 15 } 16 int n,m,k; 17 struct data { 18 int a,b,p,q,id,f; 19 bool operator <(const data tmp) const{ 20 return p==tmp.p?q<tmp.q:p<tmp.p; 21 } 22 }e[maxn],ask[maxn],tmp[maxn],sta[maxn]; 23 int fa[maxn],sz,ma[maxn],mb[maxn],size[maxn]; 24 int ans[maxn]; 25 int find(int x) {return fa[x]==x?fa[x]:find(fa[x]);} 26 int cnt=0; 27 void merge(int x,int y,int a,int b) { 28 x=find(x),y=find(y); 29 if(size[x]>size[y]) swap(x,y); 30 sta[++cnt].a=x;sta[cnt].b=y;sta[cnt].p=ma[y];sta[cnt].q=mb[y];sta[cnt].f=fa[x];sta[cnt].id=size[y]; 31 if(x==y) { 32 ma[x]=max(ma[x],a); 33 mb[x]=max(mb[x],b); 34 } 35 else { 36 fa[x]=y; 37 size[y]+=size[x]; 38 ma[y]=max(ma[y],a); 39 mb[y]=max(mb[y],b); 40 ma[y]=max(ma[x],ma[y]); 41 mb[y]=max(mb[x],mb[y]); 42 } 43 } 44 bool cmp(data a,data b) {return a.q==b.q?a.p<b.p:a.q<b.q;} 45 int main() { 46 47 n=read(),m=read(); 48 for(int i=1;i<=m;i++) { 49 e[i].a=read();e[i].b=read();e[i].p=read();e[i].q=read(); 50 } 51 sort(e+1,e+m+1); 52 sz=sqrt(m); 53 k=read(); 54 for(int i=1;i<=k;i++) { 55 ask[i].a=read(),ask[i].b=read(),ask[i].p=read(),ask[i].q=read();ask[i].id=i; 56 } 57 sort(ask+1,ask+k+1,cmp); 58 for(int i=1;i<=m;i+=sz) { 59 int top=0; 60 for(int j=1;j<=k;j++) if(ask[j].p>=e[i].p&&(i+sz>m||ask[j].p<e[i+sz].p)) tmp[++top]=ask[j]; 61 sort(e+1,e+i,cmp); 62 for(int j=1;j<=n;j++) fa[j]=j,size[j]=1,ma[j]=mb[j]=-2147483647; 63 int w=1; 64 for(int j=1;j<=top;j++) { 65 for(;w<i;w++) { 66 if(e[w].q>tmp[j].q) break; 67 merge(e[w].a,e[w].b,e[w].p,e[w].q); 68 } 69 cnt=0; 70 for(int t=i;t<i+sz;t++) { 71 if(e[t].p<=tmp[j].p&&e[t].q<=tmp[j].q) merge(e[t].a,e[t].b,e[t].p,e[t].q); 72 } 73 int t1=find(tmp[j].a),t2=find(tmp[j].b); 74 if(t1==t2&&ma[t1]==tmp[j].p&&mb[t1]==tmp[j].q) ans[tmp[j].id]=1; 75 while(cnt) { 76 fa[sta[cnt].a]=sta[cnt].f; 77 ma[sta[cnt].b]=sta[cnt].p; 78 mb[sta[cnt].b]=sta[cnt].q; 79 size[sta[cnt].b]=sta[cnt].id; 80 cnt--; 81 } 82 } 83 } 84 for(int i=1;i<=k;i++) if(ans[i]) puts("Yes");else puts("No"); 85 86 } View Code

?

轉載于:https://www.cnblogs.com/wls001/p/8435071.html

總結

以上是生活随笔為你收集整理的[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。