BZOJ4721: [Noip2016]蚯蚓
一眼是个优先队列暴力?甚至好像 mlogn 没有很大?
不存在的哪有能让你 1e8 跑满还不 T 的出题人
其实它是个...结论题?甚至还是个不写一写我根本无法想出来的结论
因为先切最大的
所以先切的分出来的也一定比后切的分出来的大
设 a > b
a 先分为了: a * p, a * (p - 1)
经过 t 时间后,b 被分为了: (b + t) * p, (b + t) * (p - 1)
且此时 a 分成的两段长度为: a * p + t, a * (p - 1) + t
拆一下式子发现 : a * p + t > (b + t) * p , 另一段同理
所以我们就这样发现这个东西是有单调性的,可以用队列乱搞
开三个队列
一个是存没有切过的蚯蚓
一个是存切为 px 的蚯蚓
一个是存切为 (1 - p) * x 的蚯蚓
只要保证一开始且的顺序是有序的就行了,所以预先排个序就好了
代码:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int MAXN = 100005, MAXM = 7000005;
int n, m, q, u, v, t;
int gg[MAXN], que[3][MAXN + MAXM], hd[3], tl[3];
double p;
priority_queue<int> res;
inline int rd() {
register int x = 0;
register char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)) {
x = x * 10 + (c ^ 48);
c = getchar();
}
return x;
}
int main() {
n = rd(); m = rd(); q = rd(); u = rd(); v = rd(); t = rd();
p = (double)u / (double)v;
for(int i = 1; i <= n; ++i) gg[i] = rd();
sort(gg + 1, gg + n + 1);
hd[0] = hd[1] = hd[2] = 1;
for(int i = n; i >= 1; --i) que[0][++tl[0]] = gg[i];
int cnt = 0, maxn, maxp, p1, p2, cur, tot = 0;
while(m--) {
++cnt;
maxn = 0xcfcfcfcf;
if(hd[0] <= tl[0] && que[0][hd[0]] > maxn) maxn = que[0][hd[0]], maxp = 0;
if(hd[1] <= tl[1] && que[1][hd[1]] > maxn) maxn = que[1][hd[1]], maxp = 1;
if(hd[2] <= tl[2] && que[2][hd[2]] > maxn) maxn = que[2][hd[2]], maxp = 2;
cur = que[maxp][hd[maxp]] + tot; ++hd[maxp];
p1 = (int)floor((double)cur * p);
p2 = cur - p1;
tot += q;
que[1][++tl[1]] = p1 - tot;
que[2][++tl[2]] = p2 - tot;
if(cnt == t) {
printf("%d ", cur);
cnt = 0;
}
}puts("");
cnt = 0;
while(hd[0] <= tl[0] || hd[1] <= tl[1] || hd[2] <= tl[2]) {
++cnt;
maxn = 0xcfcfcfcf;
if(hd[0] <= tl[0] && que[0][hd[0]] > maxn) maxn = que[0][hd[0]], maxp = 0;
if(hd[1] <= tl[1] && que[1][hd[1]] > maxn) maxn = que[1][hd[1]], maxp = 1;
if(hd[2] <= tl[2] && que[2][hd[2]] > maxn) maxn = que[2][hd[2]], maxp = 2;
cur = que[maxp][hd[maxp]] + tot; ++hd[maxp];
if(cnt == t) {
printf("%d ", cur);
cnt = 0;
}
}puts("");
return 0;
}
禁止诸如开发者知识库/布布扣/码迷/学步园/马开东等 copy 他人博文乃至博客的网站转载
,用户转载请注明出处:https://www.cnblogs.com/xcysblog/

浙公网安备 33010602011771号