QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#833600#853. Flat Organizationucup-team5071#WA 11ms3904kbC++203.9kb2024-12-26 21:53:022024-12-26 21:53:02

Judging History

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

  • [2024-12-26 21:53:02]
  • 评测
  • 测评结果:WA
  • 用时:11ms
  • 内存:3904kb
  • [2024-12-26 21:53:02]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
ostream &operator<<(ostream &out, pair<T1, T2> p)
{
    out << "(" << p.first << "," << p.second << ")";
    return out;
}
template <typename T>
ostream &operator<<(ostream &out, vector<T> v)
{
    out << "[";
    if (!v.empty())
        cout << v[0];
    for (int i = 1; i < (int)v.size(); i++)
        out << "," << v[i];
    out << "]";
    return out;
}
typedef long long ll;
const ll inf = 1e18;
int gmin(ll &x, ll y)
{
    if (y < x)
    {
        x = y;
        return 1;
    }
    return 0;
}
struct info
{
    int x, p, q;
};
void solve()
{
    int n;
    cin >> n;
    vector<vector<pair<int, ll>>> ve(n + 1);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            ll x;
            cin >> x;
            if (x > 0)
                ve[i].emplace_back(j, x);
        }
    }
    if (n == 1)
    {
        cout << "YES\n0 0\n";
        return;
    }
    if (n == 2)
    {
        cout << "NO\n";
        return;
    }
    stack<int> s;
    int num = 0, dfstime = 0;
    vector<int> col(n + 1), dfn(n + 1), low(n + 1);
    auto tarjan = [&](auto &self, int u) -> void
    {
        s.push(u);
        dfn[u] = low[u] = ++dfstime;
        for (auto [v, len] : ve[u])
        {
            if (!dfn[v])
            {
                self(self, v);
                low[u] = min(low[u], low[v]);
            }
            else if (!col[v])
                low[u] = min(low[u], dfn[v]);
        }
        if (dfn[u] == low[u])
        {
            col[u] = ++num;
            while (s.top() != u)
            {
                col[s.top()] = num;
                s.pop();
            }
            s.pop();
        }
    };
    for (int i = 1; i <= n; i++)
        if (!dfn[i])
            tarjan(tarjan, i);
    vector<vector<pair<int, ll>>> ve2(num + 1);
    vector<vector<tuple<int, ll, int, int>>> ve3(num + 1);
    vector<int> cnt(num + 1);
    for (int i = 1; i <= n; i++)
    {
        for (auto &[to, len] : ve[i])
            if (col[i] != col[to])
            {
                ve2[col[i]].emplace_back(col[to], len);
                ve3[col[to]].emplace_back(col[i], len, i, to);
                cnt[col[to]]++;
            }
    }
    vector<int> lis{0};
    {
        queue<int> qu;
        for (int i = 1; i <= num; i++)
            if (cnt[i] == 0)
                qu.push(i);
        while (!qu.empty())
        {
            int x = qu.front();
            qu.pop();
            lis.push_back(x);
            for (auto &[to, len] : ve2[x])
            {
                if (--cnt[to] == 0)
                    qu.push(to);
            }
        }
    }
    vector<int> id(n + 1);
    for (int i = 1; i <= num; i++)
        id[lis[i]] = i;
    vector<ll> dp(num + 1, inf);
    vector<info> pr(num + 1);
    vector<vector<pair<ll, int>>> mi(num + 1, vector<pair<ll, int>>(num + 1, make_pair(inf, 0)));
    dp[1] = 0;
    mi[1][1] = make_pair(0, 1);
    for (int i = 2; i <= num; i++)
    {
        for (auto [to, len, p, q] : ve3[lis[i]])
        {
            to = id[to];
            if (gmin(dp[i], mi[to][i - 1].first + len))
            {
                pr[i] = info{mi[to][i - 1].second, p, q};
            }
        }
        mi[i][i] = {dp[i], i};
        for (int j = i - 1; j >= 1; j--)
            mi[j][i] = min(mi[j][i], mi[j + 1][i]);
    }
    int now = num;
    vector<pair<int, int>> ans;
    while (now != 1)
    {
        ans.emplace_back(pr[now].p, pr[now].q);
        now = pr[now].x;
    }
    cout << "YES\n";
    cout << ans.size() << " " << dp[num] << "\n";
    reverse(ans.begin(), ans.end());
    for (auto [x, y] : ans)
        cout << x << " " << y << "\n";
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while (T--)
        solve();
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3564kb

input:

1
5
0 1 0 6 11
0 0 1 6 12
2 0 0 7 12
0 0 0 0 4
0 0 0 0 0

output:

YES
2 10
1 4
4 5

result:

ok OK!

Test #2:

score: -100
Wrong Answer
time: 11ms
memory: 3904kb

input:

100
5
0 1 0 6 11
0 0 1 6 12
2 0 0 7 12
0 0 0 0 4
0 0 0 0 0
1
0
2
0 0
7 0
2
0 1000000000
0 0
3
0 0 5
6 0 0
0 7 0
3
0 4 6
0 0 0
0 1 0
3
0 4 0
0 0 0
6 3 0
3
0 0 0
10 0 6
3 0 0
3
0 1999999998 1999999999
0 0 1999999998
0 0 0
50
0 105800 801 1800 64800 0 259200 288801 72201 12801 125000 20001 28801 33800 ...

output:

YES
2 10
1 4
4 5
YES
0 0
NO
NO
YES
0 0
YES
2 7
1 3
3 2
YES
2 9
3 1
3 2
YES
2 9
2 3
3 1
YES
2 3999999996
1 2
2 3
YES
3 602
4 33
11 47
34 39
YES
3 649
27 12
32 45
17 29
YES
5 1209
1 18
14 35
35 4
4 25
25 12
YES
3 844
3 8
1 41
14 21
YES
3 866
17 35
35 44
46 26
YES
4 1066
10 28
36 24
24 2
37 8
YES
3 112...

result:

wrong answer Test 6: The solution is not optimal