QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#700565#9315. Rainbow Bracket SequenceLETTERWA 1ms3716kbC++203.7kb2024-11-02 13:10:132024-11-02 13:10:14

Judging History

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

  • [2024-11-02 13:10:14]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3716kb
  • [2024-11-02 13:10:13]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
const int N = 305, M = 505, inf = 1E9;
int cnt, h[N], cur[N], dis[N], vis[N], nxt[M << 1], vs[M << 1], cap[M << 1], cost[M << 1]; // 注意是否会RE,MLE
int S, T, mincost;
int n, m;   //!!!不要在栈内 int S,T
void init() //!!!
{
    cnt = 0;
    mincost = 0;
    memset(nxt, -1, sizeof nxt); // 注意多测是否会超时
    memset(h, -1, sizeof h);     // 注意多测是否会超时
}
void addedge(int u, int v, int w, int c)
{
    vs[cnt] = v;
    cap[cnt] = w;
    cost[cnt] = c;
    nxt[cnt] = h[u];
    h[u] = cnt++;
    vs[cnt] = u;
    cap[cnt] = 0;
    cost[cnt] = -c;
    nxt[cnt] = h[v];
    h[v] = cnt++;
}

bool spfa()
{
    for (int i = 0; i < N; i++)
    {
        dis[i] = inf; // 注意多测是否会超时
    }
    queue<int> q;
    dis[S] = 0;
    q.push(S);
    vis[S] = 1;
    while (!q.empty())
    {
        auto u = q.front();
        q.pop();
        vis[u] = 0;
        for (int i = h[u]; ~i; i = nxt[i])
        {
            int v = vs[i], w = cost[i];
            if (dis[v] > dis[u] + w && cap[i])
            {
                dis[v] = dis[u] + w;
                if (!vis[v])
                {
                    vis[v] = 1;
                    q.push(v);
                }
            }
        }
    }
    return dis[T] != inf;
}
int dfs(int u, int flow)
{
    if (u == T || (!flow))
    {
        return flow;
    }
    int ret = 0;
    vis[u] = 1;
    for (int &i = cur[u]; ~i; i = nxt[i])
    {
        int v = vs[i], d, w = cost[i];
        if (!vis[v] && cap[i] && dis[v] == dis[u] + w && (d = dfs(v, min(flow - ret, cap[i]))))
        {
            ret += d;
            cap[i] -= d;
            mincost += d * w; //<long long
            cap[i ^ 1] += d;
            if (ret == flow)
            {
                vis[u] = 0; //!!!
                return ret;
            }
        }
    }
    vis[u] = 0;
    return ret;
}
void dinic(int sum)
{
    int ret = 0;
    while (spfa())
    {
        memcpy(cur, h, sizeof h); // 注意多测是否会超时
        ret += dfs(S, inf);
    }
    if (ret < n)
    {
        cout << -1 << "\n";
    }
    else
    {
        cout << sum - mincost << "\n";
    }
}
void solve()
{
    // 左括号下界转为右括号上界
    // 每个点向对应颜色连边,容量为1,流量为1表示此处有一个右括号,单位流量费用为此处的价值
    // ans=sum-mincost,最小费用即最大价值
    // 因为1 2 3 4 5 6最多有0 1 1 2 2 3个右括号
    // 所以i向i-1连边,容量为(i-1)/2
    // 颜色向T连边,容量为右括号上界
    init();
    cin >> n >> m;
    vector<int> cnt(m + 1), val(2 * n + 1), col(2 * n + 1);
     
    for (int i = 1; i <= m; i++)
    {
        cin >> cnt[i];
        cnt[i] *= -1;
    }
    for (int i = 1; i <= 2 * n; i++)
    {
        cin >> col[i];
        cnt[col[i]]++;
    }
    int sum = 0;
    for (int i = 1; i <= 2 * n; i++)
    {
        cin >> val[i];
        sum += val[i];
    }
	S = 0, T = N - 1;
    for (int i = 1; i <= 2 * n; i++)
    {
        addedge(i, 2 * n + col[i], 1, val[i]);
    }
    addedge(S, 2*n, n, 0);
    for (int i = 2; i <= 2 * n; i++)
    {
        addedge(i, i - 1, (i - 1) / 2, 0);
    }
    for (int i = 1; i <= m; i++)
    {
        addedge(2 * n + i, T, cnt[i], 0);
        if (cnt[i] < 0)
        {
            cout << -1 << "\n";
            return;
        }
    }
    dinic(sum);
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
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: 3716kb

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:

-1
343766215
2351080746
3426965219
-1
-1
1351561190
2539318868
1013080942
-1
-1
-1
2231197660
2719131728
3983627641
-1
-1
1046749330
6115214757
3920988203
-1
3902088946
-1
2566553992
-1
5977120748
7505501534
-1
5054275471
1467678317
883992368
1044562986
-1
4024634503
-1
1447294256
6757607722
3688048...

result:

wrong answer 10th numbers differ - expected: '4656646546', found: '-1'