QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#572682#9315. Rainbow Bracket Sequence7islandsWA 1ms3656kbC++142.9kb2024-09-18 15:55:252024-09-18 15:55:25

Judging History

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

  • [2024-09-18 15:55:25]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3656kb
  • [2024-09-18 15:55:25]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=0x3f3f3f3f;
const ll infll=0x3f3f3f3f3f3f3f3f;
//#define int long long
#define pii pair <int,int>
#define ld long double
#define endl "\n"
const int N=2050,M=2050;
int l[N];
int col[N];
int val[N];


const int INF = 0x3f3f3f3f;
int tot = 1, lnk[N], cur[N], ter[M], nxt[M], cap[M], cost[M], dis[N], ret;
bool vis[N];

void adda(int u, int v, int w, int c) {
  ter[++tot] = v, nxt[tot] = lnk[u], lnk[u] = tot, cap[tot] = w, cost[tot] = c;
}

void ADD(int u, int v, int w, int c) { adda(u, v, w, c), adda(v, u, 0, -c); }

bool spfa(int s, int t) {
  memset(dis, 0x3f, sizeof(dis));
  memcpy(cur, lnk, sizeof(lnk));
  std::queue<int> q;
  q.push(s), dis[s] = 0, vis[s] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop(), vis[u] = 0;
    for (int i = lnk[u]; i; i = nxt[i]) {
      int v = ter[i];
      if (cap[i] && dis[v] > dis[u] + cost[i]) {
        dis[v] = dis[u] + cost[i];
        if (!vis[v]) q.push(v), vis[v] = 1;
      }
    }
  }
  return dis[t] != INF;
}

int dfs(int u, int t, int flow) {
  if (u == t) return flow;
  vis[u] = 1;
  int ans = 0;
  for (int &i = cur[u]; i && ans < flow; i = nxt[i]) {
    int v = ter[i];
    if (!vis[v] && cap[i] && dis[v] == dis[u] + cost[i]) {
      int x = dfs(v, t, min(cap[i], flow - ans));
      if (x) ret += x * cost[i], cap[i] -= x, cap[i ^ 1] += x, ans += x;
    }
  }
  vis[u] = 0;
  return ans;
}

int mcmf(int s, int t) {
  int ans = 0;
  //cerr<<"touch"<<endl;
  while (spfa(s, t)) {
   // cerr<<ans<<endl;
    int x;
    while ((x = dfs(s, t, INF))) ans += x;
  }
  return ans;
}



signed main (){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;
    cin >>t;
    while (t--){
        int n,m;
        cin >>n>>m;
        for (int i=0;i<=1949;i++){
            lnk[i]=0;
        }
        tot=1;
        ret=0;
        for (int i=1;i<=m;i++){
            cin >>l[i];
            l[i]=-l[i];
        }
        for (int i=1;i<=2*n;i++){
            cin >>col[i];
            l[col[i]]++;
        }
        int sum=0;
        for (int i=1;i<=2*n;i++){
            cin >>val[i];
            sum+=val[i];
        }
        int flag=1;
        for (int i=1;i<=m;i++){
            if (l[i]<0)flag=0;
        }
        int S_=1050,T_=1051;
        
        ADD(S_,n*2,n,0);
        for (int i=2;i<=n*2;i++){
            ADD(i,i-1,(i-1)/2,0);
        }
        for (int i=1;i<=n*2;i++){
            ADD(i,n*2+col[i],1,val[i]);
        }
        for (int i=1;i<=m;i++){
            ADD(i+n*2,T_,l[i],0);
        }
        if (!flag){
            cout <<-1<<endl;
            continue;
        }else{
          //  cout <<mcmf(S_,T_)<<endl;
            if (mcmf(S_,T_)==n)cout <<sum-ret<<endl;
            else cout <<-1<<endl;

        }
    }

}

详细

Test #1:

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

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: 3656kb

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
-1943886550
-868002077
-1
-1
1351561190
-1755648428
1013080942
-1
-1
-1
-2063769636
-1575835568
-311339655
417206872
-1
1046749330
1820247461
-373979093
-1
-392878350
-1
-1728413304
-1
1682153452
-1084433058
-1
759308175
1467678317
883992368
1044562986
-1
-270332793
-1
1447294256
-18323...

result:

wrong answer 3rd numbers differ - expected: '2351080746', found: '-1943886550'