Submission #539162

#TimeUsernameProblemLanguageResultExecution timeMemory
539162astoria물병 (JOI14_bottle)C++14
100 / 100
2254 ms144740 KiB
#include <bits/stdc++.h>
using namespace std;

int h,w,p,qq;
char mp[2005][2005];
int ufds_par[200005];
unordered_set<int> qr_at[200005];
int ans[200005];
int xc[200005], yc[200005];

int colour[2005][2005];
int dist[2005][2005];

int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};

int root(int x){
    if(ufds_par[x] == -1) return x;
    return ufds_par[x] = root(ufds_par[x]);
}

void merge(int x, int y, int d){
    for(int i : qr_at[y]){
        if(qr_at[x].count(i)){
            ans[i] = d;
            qr_at[x].erase(i);
        }
        else qr_at[x].insert(i);
    }
    qr_at[y].clear();
}

void connect(int u, int v, int d){
    int x=root(u), y=root(v);
    if(x==y) return;
    if(qr_at[x].size() > qr_at[y].size()){
        merge(x,y,d);
        ufds_par[y] = x;
    }
    else{ merge(y,x,d); ufds_par[x] = y;}
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin>>h>>w>>p>>qq;
    for(int i=1; i<=h; i++){
        for(int j=1; j<=w; j++){
            cin>>mp[i][j];
        }
    }
    for(int i=1; i<=p; i++) cin>>xc[i]>>yc[i];
    for(int i=0; i<qq; i++){
        int a,b;
        cin>>a>>b;
        qr_at[a].insert(i); qr_at[b].insert(i);
    }//input
    
    memset(ufds_par,-1,sizeof(ufds_par));
    
    //Multi-BFS
    queue<pair<int,int> > q;
    memset(dist,-1,sizeof(dist));
    memset(colour,-1,sizeof(colour));
    memset(ans,-1,sizeof(ans));
    for(int i=1; i<=p; i++){
        dist[xc[i]][yc[i]] = 0;
        colour[xc[i]][yc[i]] = i;
        q.emplace(xc[i],yc[i]);
    }
    int ld = 0;
    vector<pair<int,pair<int,int> > > edg;
    while(!q.empty()){
        int x=q.front().first, y=q.front().second;
        q.pop();
        for(int i=0; i<4; i++){
            int nx=x+dx[i],ny=y+dy[i];
            if(nx<=0||nx>h||ny<=0||ny>w) continue;
            if(mp[nx][ny] == '#') continue;
            if(dist[nx][ny]==-1){
                dist[nx][ny] = dist[x][y]+1;
                colour[nx][ny] = colour[x][y];
                q.push(make_pair(nx,ny));
            }
            else{
            	//All offline.
            	if(colour[x][y] == colour[nx][ny]) continue;
				edg.push_back(make_pair(dist[x][y]+dist[nx][ny],make_pair(colour[x][y],colour[nx][ny])));
            }
        }
    }
    sort(edg.begin(),edg.end());
	for(auto i : edg){
		int w=i.first, u=i.second.first, v=i.second.second;
		if(root(u)==root(v)) continue;
		connect(u,v,w);
	}
    
    for(int i=0; i<qq; i++){
    	//assert(ans[i]!=-1);
        cout<<ans[i]<<'\n';
    }
    /*for(int i=1; i<=p; i++){
    	cout<<root(i);
    }*/
}

Compilation message (stderr)

bottle.cpp: In function 'int main()':
bottle.cpp:71:9: warning: unused variable 'ld' [-Wunused-variable]
   71 |     int ld = 0;
      |         ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...