이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxN = 1e5 + 5;
const int mod = 1e9 + 7;
const ll oo = 1e18;
int n, m;
int block_size = 1000;
int mark[maxN];
int lab[maxN];
int res[maxN];
vector<pair<int, int>> vc;
int Findset(int u)
{
return lab[u] < 0 ? u : Findset(lab[u]);
}
void Unite(int u, int v)
{
int r = Findset(u), s = Findset(v);
if(r == s)
return;
if(lab[r] > lab[s])
swap(r, s);
vc.pb({r, lab[r]});
vc.pb({s, lab[s]});
lab[r] += lab[s];
lab[s] = r;
}
void roll_back(int sz)
{
while(vc.size() > sz)
{
pair<int, int> tmp = vc.back();
vc.pop_back();
lab[tmp.fi] = tmp.se;
}
}
struct TEdge
{
int u, v, w;
} e[maxN];
int q;
struct TQuery
{
int type;
int s, w;
} qu[maxN];
vector<int> upd[maxN];
void ReadInput()
{
cin >> n >> m;
for(int i=1; i<=m; i++)
{
int u, v, w;
cin >> u >> v >> w;
e[i] = {u, v, w};
}
cin >> q;
for(int i=1; i<=q; i++)
{
cin >> qu[i].type >> qu[i].s >> qu[i].w;
}
}
void Solve()
{
for(int i=1; i<=block_size; i++)
{
memset(lab, -1, sizeof lab);
vc.clear();
int l = block_size * (i - 1) + 1, r = min(q, block_size * i);
if(l > q)
break;
for(int j=1; j<=m; j++)
mark[j] = 0;
for(int j=l; j<=r; j++)
{
if(qu[j].type == 1)
{
mark[qu[j].s] = 1;
}
}
vector<int> unchanged, query, changed;
for(int j=1; j<=m; j++)
{
if(!mark[j])
unchanged.pb(j);
else
changed.pb(j);
}
for(int j=l; j<=r; j++)
if(qu[j].type == 2)
query.pb(j);
for(int j=l; j<=r; j++)
{
if(qu[j].type == 1)
e[qu[j].s].w = qu[j].w;
else
{
for(int v : changed)
if(e[v].w >= qu[j].w)
upd[j].pb(v);
}
}
sort(unchanged.begin(), unchanged.end(), [](int i, int j)
{
return e[i].w > e[j].w;
});
sort(query.begin(), query.end(), [](int i, int j)
{
return qu[i].w > qu[j].w;
});
int p = 0;
for(int j : query)
{
while(p < unchanged.size() && e[unchanged[p]].w >= qu[j].w)
{
Unite(e[unchanged[p]].u, e[unchanged[p]].v);
p++;
}
int sz = vc.size();
for(int v : upd[j])
{
// if(j == 5) cout << v << " ";
Unite(e[v].u, e[v].v);
}
res[j] = -lab[Findset(qu[j].s)];
roll_back(sz);
}
}
for(int i=1; i<=q; i++)
{
if(qu[i].type == 2)
cout << res[i] << '\n';
}
}
int32_t main()
{
// freopen("x.inp", "r", stdin);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ReadInput();
Solve();
}
컴파일 시 표준 에러 (stderr) 메시지
bridges.cpp: In function 'void roll_back(int)':
bridges.cpp:37:21: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
37 | while(vc.size() > sz)
| ~~~~~~~~~~^~~~
bridges.cpp: In function 'void Solve()':
bridges.cpp:121:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
121 | while(p < unchanged.size() && e[unchanged[p]].w >= qu[j].w)
| ~~^~~~~~~~~~~~~~~~~~
# | 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... |