QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#571089#9315. Rainbow Bracket SequencenumberesWA 0ms3692kbC++202.6kb2024-09-17 20:27:532024-09-17 20:27:54

Judging History

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

  • [2024-09-17 20:27:54]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3692kb
  • [2024-09-17 20:27:53]
  • 提交

answer

#include<bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>
#define mp make_pair
#define ll long long
#define fi first
#define se second
using namespace std;
struct node {
	int to, cap, rev, cost;
	node() : to(), cap(), rev(), cost() {}
	node(int _to, int _cap, int _rev, int _cost) : to(_to), cap(_cap), rev(_rev), cost(_cost) {}
};
int n, m; const ll inf = 1e18;
vector<node> g[5005];
ll lev[5005]; bool vis[5005]; int iter[5005];
void add_edge(int fr, int to, int cap, int cost) {
	g[fr].pb({to, cap, (int)g[to].size(), cost});
	g[to].pb({fr, 0, (int)g[fr].size() - 1, -cost});
}
bool spfa(int s, int t) {
	queue<int> q;
	for(int i = 0; i <= n * 2 + m + 1; i++) lev[i] = inf;
	lev[s] = 0; vis[s] = 1; q.push(s);
	while(!q.empty()) {
		int u = q.front(); q.pop(); vis[u] = 0;
		for(auto nxt : g[u]) {
			int v = nxt.to;
			if(nxt.cap > 0 && lev[v] > lev[u] + nxt.cost) {
				lev[v] = lev[u] + nxt.cost;
				if(!vis[v]) {vis[v] = 1; q.push(v);}
			}
		}
	}
	return lev[t] != inf;
}
pair<int, ll> dfs(int u, int t, int flow) {
	if(u == t) return mp(flow, 0);
	vis[u] = 1;
	for(int &i = iter[u]; i < (int)g[u].size(); i++) {
		node &nxt = g[u][i]; int v = nxt.to; // 注意这里的引用
		if(!vis[v] && nxt.cap > 0 && lev[v] == lev[u] + nxt.cost) {
			pair<int, ll> tmp = dfs(v, t, min(flow, nxt.cap));
			if(tmp.fi > 0) {
				nxt.cap -= tmp.fi;
				g[v][nxt.rev].cap += tmp.fi;
				vis[u] = 0;
				return mp(tmp.fi, tmp.se + nxt.cost);
			}
		}
	}
	vis[u] = 0; //别漏掉了
	return mp(0, 0);
}
pair<int, ll> min_cost_max_flow(int s, int t) {
	int flow = 0; ll sum = 0;
	while(spfa(s, t)) {
		memset(iter, 0, sizeof(iter));
		pair<int, ll> cur;
		while((cur = dfs(s, t, 1e9)).fi > 0) {
			flow += cur.fi; sum += cur.fi * cur.se;
		}
	}
	return mp(flow, sum);
}
int l[105], c[205], v[205];
vector<int> p[105];
int main() {
	int t; cin >> t;
	while(t--) {
		cin >> n >> m; ll sum = 0;
		for(int i = 0; i <= n * 2 + m + 1; i++) {
			g[i].clear(); p[i].clear();
		}
		for(int i = 1; i <= m; i++)
			cin >> l[i];
		for(int i = 1; i <= n * 2; i++) {
			cin >> c[i]; p[c[i]].pb(i);
		}
		for(int i = 1; i <= n * 2; i++) {
			cin >> v[i]; sum += v[i];
		}
		add_edge(0, n * 2, n, 0);
		for(int i = n * 2; i >= 2; i--) {
			add_edge(i, i - 1, (i - 1) / 2, 0);
		}
		for(int i = 1; i <= m; i++) {
			for(auto x : p[i])
				add_edge(x, i + n * 2, 1, v[x]);
			add_edge(i + n * 2, n * 2 + m + 1, (int)p[i].size() - l[i], 0);
		}
		pair<int, ll> ans = min_cost_max_flow(0, n * 2 + m + 1);
		if(ans.fi != n) cout << -1 << endl;
		else cout << sum - ans.se << endl;
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 0ms
memory: 3692kb

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
1497027962
1351561190
2539318868
1013080942
4656646546
-1
-1
2231197660
2719131728
3983627641
4712174168
3121174891
1046749330
6115214757
3920988203
3914858167
3902088946
-1
2566553992
5268471900
5977120748
7505501534
-1
5054275471
1467678317
883992368
104456298...

result:

wrong answer 6th numbers differ - expected: '-1', found: '1497027962'