QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#776109#7905. Ticket to RidewangjunruiRE 0ms3908kbC++141.9kb2024-11-23 17:34:542024-11-23 17:34:55

Judging History

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

  • [2024-11-23 17:34:55]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:3908kb
  • [2024-11-23 17:34:54]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e4 + 5;
constexpr int base = 1e6 + 33;
constexpr int mod = 998244353;
typedef long long ll;
typedef unsigned long long ull;
int n, m;
vector<pair<int, int>> G[N];
struct node
{
	int fa[N], nxt[N];
	int maxpos;
	ll max, c[N];
	inline int find(int x)
	{
		return !fa[x] ? x : fa[x] = find(fa[x]);
	}
	inline void clear()
	{
		max = maxpos = 0;
		for (int i = 1; i <= n; ++i)
			c[i] = nxt[i] = fa[i] = 0;
	}
	inline void insert(int pos, ll k)
	{
		if (k > max)
		{
			c[maxpos] = k - max;
			nxt[maxpos] = pos;
			maxpos = pos;
			max = k;
		}
		else
			fa[pos] = maxpos;
	}
	inline void update(int u, ll k)
	{
		u = find(u);
		while (u != maxpos)
		{
			if (k < c[u])
			{
				c[u] -= k;
				k = 0;
				break;
			}
			k -= c[u];
			int v = nxt[u];
			assert(u != v);
			if (v == maxpos)
				maxpos = u;
			else
			{
				nxt[u] = nxt[v];
				c[u] = c[v];
			}
			fa[v] = u;
		}
		if (u == maxpos)
			max += k;
	}
} q;
ll buf[2][N];
ll answer[N];
inline void clear()
{
	for (int i = 0; i <= n; ++i)
	{
		G[i].clear();
		buf[0][i] = buf[1][i] = answer[i] = 0;
	}
}
inline void work()
{
	cin >> n >> m;
	for (int i = 1; i <= m; ++i)
	{
		int l, r, v;
		cin >> l >> r >> v;
		G[r].emplace_back(l, v);
	}
	auto f = buf[0], g = buf[1];
	for (int r = 1; r <= n; ++r)
	{
		f[r] = f[r - 1];
		for (auto [l, v] : G[r])
			f[r] += v;
	}
	answer[n] = f[n];
	for (int j = 1; j < n; ++j)
	{
		q.clear();
		swap(f, g);
		for (int i = j; i <= n; ++i)
		{
			for (auto [l, v] : G[i])
				if (l >= j)
					q.update(l, v);
			f[i] = max(g[i - 1], q.max);
			q.insert(i, f[i]);
		}
		answer[n - j] = f[n];
	}
	for (int i = 1; i <= n; ++i)
		cout << answer[i] << ' ';
	cout << '\n';
	clear();
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int test = 1;
	cin >> test;
	while (test --)
		work();
	return 0;
}

详细

Test #1:

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

input:

2
4 3
0 2 3
3 4 2
0 3 1
3 1
1 3 100

output:

2 3 5 6 
0 100 100 

result:

ok 2 lines

Test #2:

score: -100
Runtime Error

input:

1000
2 9
0 2 396628655
1 2 268792718
0 2 16843338
1 2 717268783
0 1 693319712
0 1 856168102
1 2 407246545
1 2 527268921
0 1 536134606
6 2
2 5 451394766
0 5 695984050
9 7
0 6 73936815
2 9 505041862
4 5 223718927
5 7 179262261
3 5 449258178
0 5 493128
0 3 994723920
6 6
3 5 433389755
2 4 773727734
4 5 ...

output:


result: