您的位置:首页 > 其它

Codeforces 187D BRT Contract (线段树)

2016-05-23 11:00 489 查看
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <functional>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;

#define eps 1e-10
#define N 200020
#define B 20
#define M 3000020
#define inf 0x3f3f3f3f
#define LL long long
#define pii pair<int, int>
#define MP make_pair
#define fi first
#define se second
#define mod 1000000007
#define ls (i << 1)
#define rs (ls | 1)
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs

int n, g, r;
LL l
;
LL san
;
int cnt;
LL f
;
int mi[N << 2];

void update(int x, int v, int ll, int rr, int i) {
if(ll == rr) {
mi[i] = min(mi[i], v);
return;
}
if(x <= md) update(x, v, lson);
else update(x, v, rson);
mi[i] = min(mi[ls], mi[rs]);
}
int query(int l, int r, int ll, int rr, int i) {
if(ll == l && rr == r) return mi[i];
if(r <= md) return query(l, r, lson);
if(l > md) return query(l, r, rson);
return min(query(l, md, lson), query(md + 1, r, rson));
}
int calc(int L, int R) {
int p = lower_bound(san + 1, san + cnt + 1, L) - san;
if(p > cnt) return inf;
int pp = lower_bound(san + 1, san + cnt + 1, R) - san;
if(pp > cnt || san[pp] != R) --pp;
if(p <= pp) return query(p, pp, 1, cnt, 1);
return inf;
}
LL bf(int t) {
LL ret = t;
for(int i = 1; i <= n; ++i) {
ret += l[i] - l[i - 1];
t = (t + l[i] - l[i - 1]) % (r + g);
if(t >= g) ret += r + g - t, t = 0;
}
return l[n + 1] - l
+ ret;
}
void get_data() {
freopen("tt.txt", "w", stdout);
srand(time(0));
int n = rand() % 10 + 1, g = rand() % 10 + 1, r = rand() % 10 + 1;
printf("%d %d %d\n", n, g, r);
for(int i = 1; i <= n + 1; ++i) {
printf("%d ", rand() % 10 + 1);
}
puts("");
int q = 50;
printf("%d\n", q);
for(int i = 1; i <= q; ++i) {
printf("%d\n", i);
}
exit(0);
}
int main() {
//	get_data();
//	freopen("tt.txt", "r", stdin);
scanf("%d%d%d", &n, &g, &r);
for(int i = 1; i <= n + 1; ++i) {
scanf("%lld", &l[i]);
l[i] += l[i - 1];
san[++cnt] = l[i] % (r + g);
}
sort(san + 1, san + cnt + 1);
cnt = unique(san + 1, san + cnt + 1) - san - 1;
memset(mi, 0x3f, sizeof mi);
for(int i = n; i >= 1; --i) {
int mi = inf;
LL x = (l[i]) % (r + g) + g;
mi = min(mi, calc(x, r + g - 1));
mi = min(mi, calc(l[i] % (r + g) - r, l[i] % (r + g) - 1));
if(mi == inf) f[i] = l[n + 1] - l[i];
else f[i] = l[mi] - l[i] + (r + g - (l[mi] - l[i]) % (r + g)) + f[mi];
int p;
p = lower_bound(san + 1, san + cnt + 1, l[i] % (r + g)) - san;
update(p, i, 1, cnt, 1);
}
int q;
scanf("%d", &q);
while(q--) {
int t;
scanf("%d", &t);
int tt = t;
t %= (r + g);
int mi = inf;
int L, R;

if(t <= g) {
L = g - t;
R = r + g - 1 - t;
mi = min(mi, calc(L, R));
}
else {
L = 0, R = r + g - 1 - t;
mi = min(mi, calc(L, R));
L = r + g - t + g, R = r + g - 1;
mi = min(mi, calc(L, R));
}
LL ans = 0;
if(mi == inf) ans = l[n + 1] + tt;
else {
ans = tt + l[mi] + (r + g - (tt + l[mi]) % (r + g)) + f[mi];
}
printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: