并查集tle4个点求调
查看原帖
并查集tle4个点求调
1122530
elpsconr楼主2024/9/8 17:02

我这个时间复杂度应该烤鸭优化到O(q+h*w)但是我不会优化,求调

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define all(x) x.begin(),x.end()
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define lc rt<<1
#define rc rt<<1|1
const int N=3e5+6,yyx=1e9+7;
int n,h,w,q,r[N],c[N];
struct DSU{
    vector<int> fa,sz,d;
    DSU(int n){
        fa.resize(n+1);
        sz.resize(n+1,1);
        d.resize(n+1,0);
        iota(fa.begin(),fa.end(),0);
    }
    int find(int x){
        if(x==fa[x]) return x;
        int px=find(fa[x]);
        d[x]+=d[fa[x]];
        fa[x]=px;
        return fa[x];
    }
    bool same(int x,int y){
        int px=find(x),py=find(y);
        return px==py;
    }
    bool same(int x,int y,int k){
        return d[x]-d[y]==k;
    }
    void merge(int x,int y,int k){
        int px=find(x),py=find(y);
        if(px!=py){
            fa[px]=py;
            sz[py]+=sz[px];
            d[px]=k+d[y]-d[x];
        }
    }
    void merge(int x,int y){
        int px=find(x),py=find(y);
        if(px!=py){
            fa[px]=py;
            sz[py]+=sz[px];
        }
    }
    int size(int x){
        return sz[find(x)];
    }
};
inline void solve(){
  cin>>h>>w>>q;
  for(int i=1;i<=q;++i){
    cin>>r[i]>>c[i];
  }
  DSU dsu(h*w+1);
  for(int i=2;i<=q;++i){
    int u=(r[i-1]-1)*w+c[i-1],v=(r[i]-1)*w+c[i];
    if(!dsu.same(u,v)){
        dsu.merge(u,v);
    }
    else{
        int x=r[i],y=c[i];
        while(x-2>=0){
            if(!dsu.same((x-2)*w+c[i],v)){
                dsu.merge((x-2)*w+c[i],v);
                break;
            }
            x--;
        }
        x=r[i],y=c[i];
        while(x<=h-1){
            if(!dsu.same((x)*w+c[i],v)){
                dsu.merge((x)*w+c[i],v);
                break;
            }
            x++;
        }
        x=r[i],y=c[i];
        while(y-1>=1){
            if(!dsu.same((r[i]-1)*w+y-1,v)){
                dsu.merge((r[i]-1)*w+y-1,v);
                break;
            }
            y--;
        }
        x=r[i],y=c[i];
        while(y+1<=w){
            if(!dsu.same((r[i]-1)*w+y+1,v)){
                dsu.merge((r[i]-1)*w+y+1,v);
                break;
            }
            y++;
        }
    }
  }
  int u=(r[1]-1)*w+c[1];
  cout<<h*w-dsu.size(u)<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}
2024/9/8 17:02
加载中...