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; }
相关文章推荐
- 第十三周实践项目课后————交通工具类(3)
- AndroidStudio插件GsonFormat快速实现JavaBean
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
- Padding Oracle Attack的一些细节与实现
- HDU 5701 中位数计数
- 项目中某个页面强制横屏
- log4j.properties配置详解
- Linux基础----vi操作
- 182. Duplicate Emails
- Android蓝牙串口连接总结
- 读大型网站技术架构一书 总结(1)
- iOS学习之——iOS 视图控制对象的生命周期
- 用几句话实现意想不到的功能2(被忽略的TextView属性)
- java入门、java学习:如何理解Java面向对象
- VS2010使用c++、gSOAP创建WebService 图文教程
- String、StringBuffer与StringBuilder区别
- 大数对整数的相除、取模、相乘运算
- 提取不重复的整数
- HDU 5700 区间交
- Souerce 之 图片格式