BZOJ4537: [Hnoi2016]最小公倍數

來源:互聯網
上載者:User

標籤:

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 Input4 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 OutputYes
Yes
Yes
No
No
 考慮這樣一種暴力,對於每個詢問(u,v,A,B),將a<=A和b<=B的邊全部加入並查集中,最後判斷u和v是否在同一連通分量中且連通分量包含的最大的a=A,最大的b=B即可。再考慮這樣一種暴力,把詢問和邊離線按a排序,詢問時在已經加入的邊中按b值排序加入並查集中。那麼我們把這兩種暴力結合起來,按a值將詢問和邊分塊,前面的邊按第二種做法做,塊內的邊按第一種做法做就行了。因為並查集需要支援撤銷,所以要用按秩合并,時間複雜度為O(Nsqrt(N)logn)
#include<cstdio>#include<cctype>#include<queue>#include<cmath>#include<cstring>#include<algorithm>#define rep(i,s,t) for(int i=s;i<=t;i++)#define dwn(i,s,t) for(int i=s;i>=t;i--)#define ren for(int i=first[x];i;i=next[i])using namespace std;const int BufferSize=1<<16;char buffer[BufferSize],*head,*tail;inline char Getchar() {    if(head==tail) {        int l=fread(buffer,1,BufferSize,stdin);        tail=(head=buffer)+l;    }    return *head++;}inline int read() {    int x=0,f=1;char c=Getchar();    for(;!isdigit(c);c=Getchar()) if(c==‘-‘) f=-1;    for(;isdigit(c);c=Getchar()) x=x*10+c-‘0‘;    return x*f;}const int maxn=50010;const int maxm=100010;int n,m,q;struct Query {    int u,v,a,b,tp;    bool operator < (const Query& ths) const {return b<ths.b||(b==ths.b&&tp<ths.tp);}}E[maxm],Q[maxn],T[maxm*2];int pa[maxn],rk[maxn],mxa[maxn],mxb[maxn];int findset(int x) {return pa[x]==x?x:findset(pa[x]);}struct Data {int x,y,rk,mxa,mxb;}S[maxm];int top,ans[maxn];void merge(int u,int v,int a,int b) {    int x=findset(u),y=findset(v);    if(rk[x]<rk[y]) swap(x,y);    S[++top]=(Data){x,y,rk[x],mxa[x],mxb[x]};    pa[y]=x;mxa[x]=max(mxa[x],mxa[y]);mxb[x]=max(mxb[x],mxb[y]);    mxa[x]=max(mxa[x],a);mxb[x]=max(mxb[x],b);    if(rk[x]==rk[y]) rk[x]++;}void del() {    int x=S[top].x,y=S[top].y;    pa[y]=y;rk[x]=S[top].rk;mxa[x]=S[top].mxa;mxb[x]=S[top].mxb;    top--;}bool cmp(Query a,Query b) {return a.a<b.a;}int main() {    n=read();m=read();    rep(i,1,m) E[i].tp=0,E[i].u=read(),E[i].v=read(),E[i].a=read(),E[i].b=read();    q=read();rep(i,1,q) Q[i].tp=i,Q[i].u=read(),Q[i].v=read(),Q[i].a=read(),Q[i].b=read();    int SIZE=sqrt(m*2),cnt=0;    sort(E+1,E+m+1,cmp);    sort(Q+1,Q+q+1,cmp);    rep(i,1,m) {        if((++cnt==SIZE)||i==m) {            int N=0;            rep(j,1,i-cnt) T[++N]=E[j];            rep(j,1,q) if(Q[j].a>=E[i-cnt+1].a&&(i==m||Q[j].a<E[i+1].a)) T[++N]=Q[j];            if(i-cnt!=N) {                rep(j,1,n) pa[j]=j,rk[j]=0,mxa[j]=mxb[j]=-1;                sort(T+1,T+N+1);top=0;                rep(j,1,N) {                    if(T[j].tp) {                        rep(k,i-cnt+1,i+1) {                            if(E[k].a>T[j].a||k>i) {                                int pa1=findset(T[j].u),pa2=findset(T[j].v);                                if(pa1==pa2&&mxa[pa1]==T[j].a&&mxb[pa1]==T[j].b) ans[T[j].tp]=1;                                rep(z,i-cnt+1,k-1) if(E[z].b<=T[j].b) del();                                break;                            }                            if(E[k].b<=T[j].b) merge(E[k].u,E[k].v,E[k].a,E[k].b);                        }                    }                    else merge(T[j].u,T[j].v,T[j].a,T[j].b);                }            }            cnt=0;        }    }    rep(i,1,q) puts(ans[i]?"Yes":"No");    return 0;}

  

BZOJ4537: [Hnoi2016]最小公倍數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.