QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#572395#9315. Rainbow Bracket SequenceRUOHUIWA 1ms3672kbC++203.1kb2024-09-18 14:17:312024-09-18 14:17:31

Judging History

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

  • [2024-09-18 14:17:31]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3672kb
  • [2024-09-18 14:17:31]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define pii pair<int,int>
using namespace std;
bool debug = 1;
#define dbg(x) if(debug) cerr<<BRIGHT_CYAN<<#x<<COLOR_RESET<<" = "<<(x)<<NORMAL_FAINT<<COLOR_RESET<<endl;
const string COLOR_RESET = "\033[0m", BRIGHT_CYAN = "\033[1;36m", NORMAL_FAINT = "\033[0;2m";
const int N = 1009;
int n, m, dist[N], head[N], flow[N], vis[N], S, T, tot, pre[N];
struct Edge
{
    int v, rest, p, nxt;
} edge[N * 40];
typedef long long ll;
int col[N], cnt[N], val[N];

bool SPFA()
{
    for (int i = 1; i <= n + m + 10; i++)
        dist[i] = flow[i] = 1e16, vis[i] = 0;
    queue<int> q;
    q.push(S), dist[S] = 0;
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        vis[u] = 0;
        for (int i = head[u]; i; i = edge[i].nxt)
        {
            if (edge[i].rest && dist[edge[i].v] > dist[u] + edge[i].p)
            {
                dist[edge[i].v] = dist[u] + edge[i].p;
                pre[edge[i].v] = i;
                flow[edge[i].v] = min(flow[u], edge[i].rest);
                if (!vis[edge[i].v])
                    q.push(edge[i].v), vis[edge[i].v] = 1;
            }
        }
    }
    return dist[T] < 1e15;
}

void maxflow()
{
    ll ans = 0, f = 0;
    //cout << "maxflow" << endl;
    while (SPFA())
    {
        //cout << "SPFA" << endl;
        //cout << flow[T] << " " << dist[T] << endl;
        f += flow[T];
        ans += flow[T] * dist[T];
        int x = T;
        while (x != S)
        {
            int y = pre[x];
            edge[y].rest -= flow[T];
            edge[y ^ 1].rest += flow[T];
            x = edge[y ^ 1].v;
        }
    }
    //最大流保证序列合法
    if (f < n / 2) cout << "-1\n";
    else
    {
        ans = -ans;
        for (int i = 1; i <= n; i++)
            ans += val[i];
        cout << ans << '\n';
    }
}

void add(int u, int v, int c, int w, int t = 1)
{
    edge[++tot] = (Edge) {v, c, w, head[u]};
    head[u] = tot;
    if (t) add(v, u, 0, -w, 0);
}

void solve()
{
    //长度为2 * n 有m种颜色
    //n个左括号第i种颜色必须有cnt[i]个
    cin >> n >> m;
    for (int i = 1; i <= m; i++) cin >> cnt[i], cnt[i] = -cnt[i];
    n *= 2;
    for (int i = 1; i <= n; i++)
    {
        cin >> col[i];
        cnt[col[i]]++;
    }
    for (int i = 1; i <= n; i++) cin >> val[i];
    memset(head, 0, sizeof head);
    S = 1, T = 2;
    tot = 1;
    add(S, n + 2, n / 2, 0);
    for (int i = n; i > 1; i--)
    {
        add(i + 2, i + 1, 1e9, 0);
        add(i + 2, n + 2 + col[i], 1, val[i]);
    }
    add(1 + 2, n + 2 + col[1], 1, val[1]);
    bool flag = 1;
    for (int i = 1; i <= m; i++)
    {
        add(n + 2 + i, T, cnt[i], 0);
        if (cnt[i] < 0)
        {
            flag = 0;
        }
    }
    if (flag) maxflow();
    else cout << "-1\n";
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}


詳細信息

Test #1:

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

input:

2
3 2
1 2
1 2 2 2 1 2
3 1 4 2 2 1
3 2
2 2
1 2 2 2 1 2
3 1 4 2 2 1

output:

9
-1

result:

ok 2 number(s): "9 -1"

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 3644kb

input:

50
8 6
0 2 2 0 3 1
3 5 1 1 5 3 5 2 3 2 2 1 2 2 4 6
998133227 879226371 59632864 356493387 62611196 827258251 296576565 204244054 812713672 780267148 614679390 447700005 102067050 544546349 116002772 761999375
1 1
1
1 1
343766215 374461155
3 1
2
1 1 1 1 1 1
796323508 303640854 701432076 853325162 610...

output:

5220751523
374461155
2351080746
3678982693
2201471991
-1
1378573195
2596974815
1093935906
5001074851
545706543
4600692243
2231197660
3266162379
4640037833
5740148284
-1
1831202593
6488101105
4469810885
-1
4230243225
4836311506
2759956368
5751395565
6350958028
7789009332
-1
5054275471
1467678317
8839...

result:

wrong answer 1st numbers differ - expected: '-1', found: '5220751523'