이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int long long
bool f(vector<int> S){
for(int x:S)if(x==1) return false;
return true;
}
struct Unionfind{
vector<int> par, siz;
//初期化
Unionfind(int n) : par(n,-1) , siz(n,1) {}
int root(int x) {
if(par[x] == -1) return x;
else return par[x] = root(par[x]);
}
bool issame(int x,int y) {
return root(x) == root(y);
}
bool unite(int x, int y){
x = root(x); y = root(y);
if(x == y) return false;
if(siz[x] < siz[y]) swap(x,y);
par[y] = x;
siz[x] += siz[y];
return true;
}
int size(int x) {
return siz[root(x)];
}
};
signed main(){
int N,M,Q;
cin>>N>>M;
vector<vector<int>> G(M);
unordered_map<int,int> m;
for(int i=0;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
a--;
b--;
m[a*N+b] = c;
m[b*N+a] = c;
G[a].push_back(b);
G[b].push_back(a);
}
cin>>Q;
vector<int> T(Q),A(Q),B(Q);
for(int i=0;i<Q;i++) cin>>T[i]>>A[i]>>B[i];
if(f(T)){
Unionfind uf(N);
vector<pair<int,int>> S(Q);
for(int i=0;i<Q;i++) S[i] = {B[i],A[i]};
map<int,int> ans;
sort(S.begin(),S.end());
vector<tuple<int,int,int>> C = {};
for(int i=0;i<N;i++)for(int j:G[i]) C.push_back({m[i*N+j],i,j});
sort(C.begin(),C.end());
int ind = 0;
for(int i=0;i<Q;i++){
while(ind != N){
int a,b,c;
tie(a,b,c) = C[ind];
if(a > S[i].first) break;
uf.unite(b,c);
ind++;
}
ans[S[i].first*N+S[i].second] = uf.size(S[i].second);
}
for(int i=0;i<Q;i++) cout<<ans[B[i]*N+A[i]]<<endl;
return 0;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |