#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(N);
unordered_map<int,int> m;
map<int,multiset<int>> s;
map<int,pair<int,int>> ed;
map<int,int> edc;
for(int i=0;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
a--;
b--;
ed[i] = {a,b};
edc[i] = c;
m[a*N+b] = max(c,m[a*N+b]);
m[b*N+a] = max(c,m[a*N+b]);
s[a*N+b].insert(c);
s[b*N+a].insert(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];
A[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.rbegin(),S.rend());
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.rbegin(),C.rend());
int ind = 0;
for(int i=0;i<Q;i++){
while(ind != 2*(int)(m.size())){
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;
}
if(max({N,M,Q}) <= 10000){
for(int i=0;i<Q;i++){
if(T[i] == 1){
int a,b;
tie(a,b) = ed[A[i]];
s[a*N+b].erase(s[a*N+b].find(edc[A[i]]));
s[a*N+b].insert(B[i]);
swap(a,b);
s[a*N+b].erase(s[a*N+b].find(edc[A[i]]));
s[a*N+b].insert(B[i]);
edc[A[i]] = B[i];
continue;
}
queue<int> q;
q.push(A[i]);
vector<bool> seen(N,false);
seen[A[i]] = true;
while(!q.empty()){
int pos = q.front();
q.pop();
for(int x:G[pos]){
if(seen[x] || *s[pos*N+x].rbegin() < B[i]) continue;
seen[x] = true;
q.push(x);
}
}
int count = 0;
for(int i=0;i<N;i++) count += seen[i];
cout<<count<<endl;
}
return 0;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
138 ms |
1096 KB |
Output is correct |
4 |
Correct |
22 ms |
1476 KB |
Output is correct |
5 |
Correct |
23 ms |
696 KB |
Output is correct |
6 |
Correct |
25 ms |
724 KB |
Output is correct |
7 |
Correct |
27 ms |
668 KB |
Output is correct |
8 |
Correct |
24 ms |
740 KB |
Output is correct |
9 |
Correct |
31 ms |
740 KB |
Output is correct |
10 |
Correct |
21 ms |
692 KB |
Output is correct |
11 |
Correct |
22 ms |
724 KB |
Output is correct |
12 |
Correct |
21 ms |
696 KB |
Output is correct |
13 |
Correct |
31 ms |
724 KB |
Output is correct |
14 |
Correct |
27 ms |
848 KB |
Output is correct |
15 |
Correct |
31 ms |
852 KB |
Output is correct |
16 |
Correct |
25 ms |
660 KB |
Output is correct |
17 |
Correct |
23 ms |
744 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
219 ms |
30992 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
173 ms |
21528 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
792 ms |
70152 KB |
Output is correct |
2 |
Correct |
268 ms |
10668 KB |
Output is correct |
3 |
Correct |
436 ms |
59748 KB |
Output is correct |
4 |
Correct |
437 ms |
59788 KB |
Output is correct |
5 |
Correct |
791 ms |
68840 KB |
Output is correct |
6 |
Correct |
811 ms |
70076 KB |
Output is correct |
7 |
Correct |
822 ms |
68712 KB |
Output is correct |
8 |
Correct |
552 ms |
41504 KB |
Output is correct |
9 |
Correct |
517 ms |
41328 KB |
Output is correct |
10 |
Correct |
480 ms |
41484 KB |
Output is correct |
11 |
Correct |
678 ms |
55160 KB |
Output is correct |
12 |
Correct |
634 ms |
55244 KB |
Output is correct |
13 |
Correct |
640 ms |
55356 KB |
Output is correct |
14 |
Correct |
742 ms |
67768 KB |
Output is correct |
15 |
Correct |
767 ms |
68352 KB |
Output is correct |
16 |
Correct |
829 ms |
69076 KB |
Output is correct |
17 |
Correct |
845 ms |
69048 KB |
Output is correct |
18 |
Correct |
789 ms |
69364 KB |
Output is correct |
19 |
Correct |
782 ms |
69356 KB |
Output is correct |
20 |
Correct |
655 ms |
59728 KB |
Output is correct |
21 |
Correct |
697 ms |
59688 KB |
Output is correct |
22 |
Correct |
767 ms |
67252 KB |
Output is correct |
23 |
Correct |
657 ms |
56088 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
219 ms |
30992 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
138 ms |
1096 KB |
Output is correct |
4 |
Correct |
22 ms |
1476 KB |
Output is correct |
5 |
Correct |
23 ms |
696 KB |
Output is correct |
6 |
Correct |
25 ms |
724 KB |
Output is correct |
7 |
Correct |
27 ms |
668 KB |
Output is correct |
8 |
Correct |
24 ms |
740 KB |
Output is correct |
9 |
Correct |
31 ms |
740 KB |
Output is correct |
10 |
Correct |
21 ms |
692 KB |
Output is correct |
11 |
Correct |
22 ms |
724 KB |
Output is correct |
12 |
Correct |
21 ms |
696 KB |
Output is correct |
13 |
Correct |
31 ms |
724 KB |
Output is correct |
14 |
Correct |
27 ms |
848 KB |
Output is correct |
15 |
Correct |
31 ms |
852 KB |
Output is correct |
16 |
Correct |
25 ms |
660 KB |
Output is correct |
17 |
Correct |
23 ms |
744 KB |
Output is correct |
18 |
Incorrect |
219 ms |
30992 KB |
Output isn't correct |
19 |
Halted |
0 ms |
0 KB |
- |