QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#823369#1269. New Equipmentsqwesx54edfv_7yhji9ikm_AC ✓32ms5332kbC++202.5kb2024-12-20 22:38:322024-12-20 22:38:33

Judging History

This is the latest submission verdict.

  • [2024-12-20 22:38:33]
  • Judged
  • Verdict: AC
  • Time: 32ms
  • Memory: 5332kb
  • [2024-12-20 22:38:32]
  • Submitted

answer

#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 6005;
const int inf = 0x3f3f3f3f;
const long long infll = 0x3f3f3f3f3f3f3f3fll;

struct Edge {
	int to, val;
	long long cst;
	int rev;
	Edge (int _to = 0, int _val = 0, long long _cst = 0ll, int _rev = 0) :
		to(_to), val(_val), cst(_cst), rev(_rev) {}
};
vector<Edge> e[N];
void add(int u, int v, int w, long long c) {
	e[u].push_back(Edge(v, w, c, (int)e[v].size()));
	e[v].push_back(Edge(u, 0, -c, (int)e[u].size() - 1)); 
}

long long d[N] = {0};
int prx[N] = {0};
int idx[N] = {0};
bool inq[N] = {false}; 

bool BellmanFord(int s, int t) {
	memset(d, 0x3f, sizeof d);
	queue<int> q;
	q.push(s), d[s] = 0ll;
	while (!q.empty()) {
		int h = q.front();
		q.pop();
		inq[h] = false;
		for (int v = 0; v < (int)e[h].size(); v++) {
			Edge i = e[h][v];
			if (i.val > 0 && d[i.to] > d[h] + i.cst) {
				d[i.to] = d[h] + i.cst;
				prx[i.to] = h;
				idx[i.to] = v;
				if (!inq[i.to])
					inq[i.to] = true, q.push(i.to);
			}
		}
	}
	return d[t] != infll;
}

void SSP(int s, int t) {
	long long ans = 0ll;
	while (BellmanFord(s, t)) {
		ans += d[t];
		//????? 1
		for (int i = t; i != s; i = prx[i]) {
			e[prx[i]][idx[i]].val--;
			e[e[prx[i]][idx[i]].to][e[prx[i]][idx[i]].rev].val++;
		}
		printf("%lld ", ans);
	}
	printf("\n");
}

const int M = 55;
int n, m;
long long a[M] = {0}, b[M] = {0}, c[M] = {0};
vector<int> nxt[M];

long long cal(int i, int x) {
	return a[i] * x * x + b[i] * x + c[i];
}

map<int, int> mp;

void slv() {
	scanf("%d%d", &n, &m);
	mp.clear();
	for (int i = 1; i <= n; i++) {
		scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
		int l = 0, r = m;
		while (l + 1 < r) {
			int mid = (l + r) / 2;
			if (cal(i, mid) <= cal(i, mid + 1))
				r = mid;
			else 
				l = mid;
		}
		//l??n??r??n? 
		nxt[i].clear();
		for (int j = l; j >= l - n && j >= 1; j--)
			nxt[i].push_back(j), mp[j] = 1;
		for (int j = r; j <= r + n && j <= m; j++)
			nxt[i].push_back(j), mp[j] = 1; 
	}
	int tot = n;
	for (auto &i: mp) 
		i.second = ++tot;
	int S = 0, T = ++tot;
	for (int i = S; i <= T; i++)
		e[i].clear();
	for (int i = 1; i <= n; i++) {
		add(S, i, 1, 0);
		for (auto j: nxt[i])
			add(i, mp[j], 1, cal(i, j));
	}
	for (auto &i: mp)
		add(i.second, T, 1, 0);
	SSP(S, T);
}

int main()
 {
	int T;
	scanf("%d", &T);
	while (T--)
		slv(); 
	return 0;
} 

詳細信息

Test #1:

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

input:

1
3 5
2 3 10
2 -3 10
1 -1 4

output:

4 15 37 

result:

ok single line: '4 15 37 '

Test #2:

score: 0
Accepted
time: 32ms
memory: 5332kb

input:

10
50 50
2 -16 79
8 -21 54
8 -1 3
1 -7 47
5 -20 89
1 -2 47
2 -10 26
10 31 28
2 -16 37
6 -16 44
2 -8 100
3 -26 65
3 -6 91
10 -33 56
2 -7 22
2 -12 74
1 -3 7
7 -30 51
1 -4 8
1 -10 62
2 -5 5
1 -3 38
7 -32 57
4 -24 65
1 -8 97
7 -28 71
5 -13 71
2 -14 49
6 -33 100
2 7 69
8 -22 38
5 -23 88
7 20 57
7 -11 83
...

output:

2 4 9 14 24 40 72 117 170 239 327 445 592 771 972 1202 1467 1772 2117 2506 2954 3461 4035 4690 5415 6223 7137 8145 9272 10499 11858 13366 15003 16798 18736 20810 23058 25517 28172 31062 34194 37566 41209 45136 49371 53924 58847 64143 69813 75884 
4 9 17 25 33 43 57 78 107 146 194 266 356 461 590 744...

result:

ok 10 lines