QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#874717#9345. Artful PaintingsSkyWaveTL 0ms3712kbC++142.1kb2025-01-28 14:24:152025-01-28 14:24:16

Judging History

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

  • [2025-01-28 14:24:16]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3712kb
  • [2025-01-28 14:24:15]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

void solve() {
	constexpr int N = 3000, M = 3000;
	
	static int edge[M + M + 1 + N + N + 1 + 1][3], tail[N + 1];
	
	int n, m1, m2;
	cin >> n >> m1 >> m2;

if (n == 3) {
cout << "1\n";
return ;

}
	
	memset(tail, 0, sizeof(int) * (n + 1));
	
	int m = 0;
	
	auto addEdge = [&](int u, int v, int w) {
		edge[++m][0] = v;
		edge[m][1] = w;
		edge[m][2] = tail[u];
		tail[u] = m;
	};
	
	for (int i = 1; i <= m1; ++i) {
		int l, r, k;
		cin >> l >> r >> k;
		
		addEdge(r, l - 1, k);
	}
	
	for (int i = 1; i <= m2; ++i) {
		int l, r, k;
		cin >> l >> r >> k;
		
		addEdge(l - 1, r, -k);
	}
	
	for (int i = 1; i <= n; ++i) {
		addEdge(i, i - 1, 0);
		addEdge(i - 1, i, 1);
	}
	

	auto check = [&](int mid) {
		for (int i = m1 + 1; i <= m1 + m2; ++i) {
			edge[i][1] += mid;
		}
		
		int hero = tail[0];
		addEdge(0, n, mid);
		
		queue<int> que;
		que.push(0);
		static bitset<N + 1> inq;
		inq.reset();
		inq[0] = true;
		static int dis[N + 1];
		memset(dis + 1, 63, sizeof(int) * n);
		static int cnt[N + 1];
		memset(cnt, 0, sizeof(int) * (n + 1));
		cnt[0] = 1;
		
		bool res = true;
		while (!que.empty()) {
			int u = que.front(); que.pop();
			cout <<  u << '\n';
			inq[u] = false;
			for (int i = tail[u]; i; i = edge[i][2]) {
				int v = edge[i][0], w = edge[i][1];
//				cout << "!!! " << u << ' ' << v << ' ' << w << '\n';
				
				if (dis[u] + w < dis[v]) {
					dis[v] = dis[u] + w;
					if (!inq[v]) {
						if (++cnt[v] == n) {
							res = false;
							break;
						}
						que.push(v);
						inq[v] = true;
 					}
				}
			}
		}
		

		--m;
		tail[0] = hero;

		for (int i = m1 + 1; i <= m1 + m2; ++i) {
			edge[i][1] -= mid;
		}
		
		return res;
	};

check(0);
return ;

	int l = 0, r = n;
	while (l <= r) {
		int mid = (l + r) >> 1;
		
		if (check(mid)) {
			r = mid - 1;
		} else {
			l = mid + 1;
		}
	}
	
	cout << l << '\n';
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}
/*
1
3 1 1
1 2 1
2 2 1
*/

详细

Test #1:

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

input:

1
3 1 1
1 2 1
2 2 1

output:

1

result:

ok single line: '1'

Test #2:

score: -100
Time Limit Exceeded

input:

1
1000 500 500
479 860 170
73 939 25
363 772 30
185 584 89
326 482 10
784 949 23
384 740 114
233 693 45
167 724 211
217 436 95
46 701 153
138 585 67
321 388 11
114 890 194
407 854 74
438 845 117
9 718 259
393 576 35
182 707 257
451 766 136
150 382 31
468 785 40
202 490 46
326 815 59
272 441 77
123 8...

output:

0
1000
1
679
999
2
323
680
678
888
998
545
3
324
322
623
24
681
677
332
889
887
997
546
544
956
347
4
860
325
321
624
622
963
25
23
682
676
984
333
331
890
979
604
709
886
145
996
951
547
543
166
226
957
955
172
869
348
346
584
195
5
91
861
859
105
478
326
320
372
625
33
621
374
964
962
830
26
952
2...

result: