QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#709775 | #3556. Making Friends on Joitter is Fun | cpismylifeOwO | 0 | 27ms | 193072kb | C++20 | 3.8kb | 2024-11-04 16:46:11 | 2024-11-04 16:46:12 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int MaxN = 1e6 + 5;
struct Edge
{
int u, v;
};
int n, m;
Edge edges[MaxN];
void Inp()
{
cin >> n >> m;
for (int x = 1; x <= m; x++)
{
cin >> edges[x].u >> edges[x].v;
}
}
long long cur;
int parents[MaxN];
int sz[MaxN];
int sum[MaxN];
set<int> graph[MaxN];
set<int> rev[MaxN];
set<int> graphs[MaxN];
set<int> revs[MaxN];
vector<int> listing[MaxN];
vector<pair<int, int>> tmp;
int FindSet(int p)
{
if (parents[p] == p)
{
return parents[p];
}
parents[p] = FindSet(parents[p]);
return parents[p];
}
void UnionSet(int a, int b)
{
a = FindSet(a);
b = FindSet(b);
if (a == b)
{
return;
}
if (sz[a] < sz[b])
{
swap(a, b);
}
parents[b] = a;
cur += 2ll * sz[a] * sz[b];
for (int x : listing[b])
{
auto p = revs[a].find(x);
if (p != revs[a].end())
{
cur -= sz[a];
revs[a].erase(p);
sum[a]--;
}
p = graphs[a].find(x);
if (p != graphs[a].end())
{
cur -= sz[b];
graphs[a].erase(p);
}
listing[a].push_back(x);
}
graph[a].erase(b);
rev[a].erase(b);
graph[b].erase(a);
rev[b].erase(a);
for (int x : graph[b])
{
if (rev[a].find(x) != rev[a].end())
{
tmp.push_back(make_pair(x, a));
}
graph[x].erase(b);
graph[x].insert(a);
}
for (int x : rev[b])
{
if (graph[a].find(x) != graph[a].end())
{
tmp.push_back(make_pair(x, a));
}
rev[x].erase(b);
rev[x].insert(a);
}
cur += 1ll * sum[a] * sz[b];
for (int x : revs[b])
{
if (FindSet(x) == a)
{
continue;
}
auto p = revs[a].find(x);
if (p == revs[a].end())
{
cur += sz[a];
}
else
{
cur -= sz[b];
}
}
for (int x : graph[b])
{
graph[a].insert(x);
}
for (int x : rev[b])
{
rev[a].insert(x);
}
for (int x : graphs[b])
{
if (FindSet(x) != a)
{
graphs[a].insert(x);
}
}
for (int x : revs[b])
{
if (FindSet(x) != a && revs[a].insert(x).second)
{
sum[a]++;
}
}
sz[a] += sz[b];
}
void Exc()
{
for (int x = 1; x <= n; x++)
{
parents[x] = x;
sz[x] = 1;
listing[x].push_back(x);
}
for (int x = 1; x <= m; x++)
{
int u = FindSet(edges[x].u), v = FindSet(edges[x].v);
if (u == v)
{
cout << cur << "\n";
continue;
}
if (revs[v].find(edges[x].u) != revs[v].end())
{
cout << cur << "\n";
continue;
}
revs[v].insert(edges[x].u);
graphs[u].insert(edges[x].v);
sum[v]++;
cur += sz[v];
rev[v].insert(u);
graph[u].insert(v);
if (rev[u].find(v) != rev[u].end())
{
tmp.push_back(make_pair(u, v));
}
while (!tmp.empty())
{
pair<int, int> x = tmp.back();
tmp.pop_back();
UnionSet(x.first, x.second);
}
cout << cur << "\n";
}
}
int main()
{
//freopen("B.INP", "r", stdin);
//freopen("B.OUT", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int test = 1;
//cin >> test;
for (int x = 1; x <= test; x++)
{
Inp();
Exc();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 27ms
memory: 193072kb
input:
5 20 4 2 1 5 2 3 2 5 3 2 3 1 4 5 1 2 5 2 1 4 4 1 3 4 5 1 2 4 2 1 4 3 1 3 5 4 3 5 5 3
output:
1 2 3 4 6 7 8 12 15 22 22 22 22 22 22 22 22 22 22 22
result:
wrong answer 9th lines differ - expected: '16', found: '15'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%