QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#570864#9315. Rainbow Bracket SequencezqxWA 0ms3652kbC++232.5kb2024-09-17 18:31:502024-09-17 18:31:50

Judging History

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

  • [2024-09-17 18:31:50]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3652kb
  • [2024-09-17 18:31:50]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define all(tar) tar.begin(),tar.end()
#define pii pair<int,int>
#define AC return 0;
#define ll long long
const int N = 60003;
const ll inf = 0x3f3f3f3f3f3f3f3f;
struct eg {
	int to, rev;
	ll val, c;
};
vector<eg>mp[N];
int s, t, vis[N],idx;
ll dis[N], mc = 0;
void add(int x, int y, int v, int c) {
	mp[x].push_back({y, (int)mp[y].size(), v, c}), mp[y].push_back({x, (int)mp[x].size() - 1, 0, -c});
}
bool spfa() {
	for(int i=1;i<=idx;i++){
      dis[i]=inf;
      vis[i]=0;
   }
	queue<int>q;
	q.push(s), dis[s] = 0, vis[s] = 1;
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		vis[x] = 0;
		for (auto&[to, rev, val, c] : mp[x]) {
			if (dis[to] <= dis[x] + c || !val)continue;
			dis[to] = dis[x] + c;
			if (!vis[to])q.push(to), vis[to] = 1;
		}
	}
	return dis[t] != inf;
}
ll dfs(int x, ll flow) {
	if (x == t || !flow)return flow;
	ll ans = 0, d;
	vis[x] = 1;
	for (int i = 0; i < mp[x].size(); i++) {
		auto&[to, rev, val, c] = mp[x][i];
		if (!val || vis[to] || dis[to] != dis[x] + c)continue;
		d = dfs(to, min(val, flow));
		if (!d)dis[to] = inf;
		ans += d, val -= d, mp[to][rev].val += d, mc += d * c, flow -= d;
	}
	vis[x] = 0;
	return ans;
}
int id[205],c1[205],c2[205],val[205],idc[205],col[205];
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;
      n*=2;
      for(int i=1;i<=idx;i++)mp[idx].clear();
      idx=0;
      for(int i=1;i<=m;i++){
         cin>>c1[i],c2[i]=0;
         idc[i]=++idx;
      }
      for(int i=1;i<=n;i++){
         cin>>col[i];
         c2[col[i]]++;
      } 
      mc=0;
      int ans=0;
      for(int i=1;i<=n;i++){
        cin>>val[i];
        id[i]=++idx;
        ans+=val[i];
      }
      s=++idx;
      t=++idx;
      add(s,id[2*n],n/2,0);
      bool flag=0;
      for(int i=1;i<=m;i++){
        if(c1[i]>c2[i]){
          flag=0;
          break;
        }
        add(idc[i],t,c2[i]-c1[i],0);
      }
      if(flag){
         cout<<"-1\n";
         continue;
      }
      for(int i=1;i<=2*n;i++){
         add(id[i],idc[col[i]],1,val[i]);
      }
      for(int i=2*n-1;i>=1;i--){
         add(id[i+1],id[i],i/2,0);
      }
      int sum=0;
      while(spfa()){
         sum+=dfs(s,inf);
      }
      if(sum!=n/2){
         cout<<"-1\n";
      }
      else cout<<ans-mc<<'\n';
   }
	AC
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3652kb

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:

-1
-1

result:

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