【BZOJ4721】【NOIP2016】蚯蚓

【题目链接】

【思路要点】

  • 补档博客,无题解。

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN	100005
#define INF	2e9
template <typename T> void read(T &x) {
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
deque <int> a, b, c;
int delta, n, m, q;
int u, v, t, value[MAXN];
int main() {
	read(n), read(m), read(q);
	read(u), read(v), read(t);
	for (int i = 1; i <= n; i++)
		read(value[i]);
	sort(value + 1, value + n + 1);
	for (int i = n; i >= 1; i--)
		a.push_back(value[i]);
	for (int i = 1; i <= m; i++) {
		int maxnum = -INF;
		if (!a.empty()) maxnum = max(maxnum, a.front());
		if (!b.empty()) maxnum = max(maxnum, b.front());
		if (!c.empty()) maxnum = max(maxnum, c.front());
		if (!a.empty() && maxnum == a.front()) {
			long long now = a.front() + delta;
			a.pop_front();
			if (i % t == 0) printf(i + t <= m ? "%lld " : "%lld", now);
			delta += q;
			int p = now * u / v - delta;
			int q = now - now * u / v - delta;
			b.push_back(p);
			c.push_back(q);
			continue;
		}
		if (!b.empty() && maxnum == b.front()) {
			long long now = b.front() + delta;
			b.pop_front();
			if (i % t == 0) printf(i + t <= m ? "%lld " : "%lld", now);
			delta += q;
			int p = now * u / v - delta;
			int q = now - now * u / v - delta;
			b.push_back(p);
			c.push_back(q);
			continue;
		}
		if (!c.empty() && maxnum == c.front()) {
			long long now = c.front() + delta;
			c.pop_front();
			if (i % t == 0) printf(i + t <= m ? "%lld " : "%lld", now);
			delta += q;
			int p = now * u / v - delta;
			int q = now - now * u / v - delta;
			b.push_back(p);
			c.push_back(q);
			continue;
		}
	}
	printf("\n");
	for (int i = 1; i <= n + m; i++) {
		int maxnum = -INF;
		if (!a.empty()) maxnum = max(maxnum, a.front());
		if (!b.empty()) maxnum = max(maxnum, b.front());
		if (!c.empty()) maxnum = max(maxnum, c.front());
		if (!a.empty() && maxnum == a.front()) {
			if (i % t == 0) printf(i + t <= n + m ? "%d " : "%d", a.front() + delta);
			a.pop_front();
			continue;
		}
		if (!b.empty() && maxnum == b.front()) {
			if (i % t == 0) printf(i + t <= n + m ? "%d " : "%d", b.front() + delta);
			b.pop_front();
			continue;
		}
		if (!c.empty() && maxnum == c.front()) {
			if (i % t == 0) printf(i + t <= n + m ? "%d " : "%d", c.front() + delta);
			c.pop_front();
			continue;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39972971/article/details/80373831