QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#709775#3556. Making Friends on Joitter is FuncpismylifeOwO0 27ms193072kbC++203.8kb2024-11-04 16:46:112024-11-04 16:46:12

Judging History

你现在查看的是最新测评结果

  • [2024-11-04 16:46:12]
  • 评测
  • 测评结果:0
  • 用时:27ms
  • 内存:193072kb
  • [2024-11-04 16:46:11]
  • 提交

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;
}

详细

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%