UOJ 49 【UR #3】铀仓库
2017-08-10 21:04
330 查看
#49. 【UR #3】铀仓库
统计描述
提交
自定义测试
顽皮的小O潜入了著名核物理专家 Picks 的研究所,走进了存放浓缩铀的仓库。
浓缩铀存放在一个个箱子里,一共有 nn 叠箱子排成一条直线,不妨想象一根数轴,第 ii 叠箱子坐标为 xixi,竖直方向叠着 aiai 个箱子。
小O脑洞大开,决定进行一项游戏。他会先选择一个整数坐标 ss(可以不和任意一个 xixi 相等),然后初始时他两手空空站在坐标 ss 处,进行至多 tt 秒的行动。
这段时间内他的行动方式包括:
向左移动单位 11 的距离,花费 11 秒。
向右移动单位 11 的距离,花费 11 秒。
如果现在手上是空的,那么可以从当前位置拿起一个装有浓缩铀的箱子,瞬间完成。
如果现在拿着一个装有浓缩铀的箱子,那么可以把这个箱子放在当前位置所有箱子的顶部,瞬间完成。
由于小O很小,任意时刻他只能拿着至多一个箱子。他希望进行至多 tt 秒的行动后,初始位置 ss 叠着的箱子尽量多。
请你帮小O计算,他如果 ss 选择得恰到好处,并且行动足够机智,那么最多能在位置 ss 叠放多少个箱子。
(PS:危险动作,请勿模仿。)
输入格式
第一行两个整数 n,tn,t。保证 n≥1,t≥0n≥1,t≥0。第二行 nn 个严格递增的正整数,第 ii 个为 xixi。
第三行 nn 个正整数,第 ii 个为 aiai。
输出格式
一行一个非负整数,表示位置 ss 至多能叠放多少个箱子。C/C++ 输入输出 long long 时请用
%lld。C++ 可以直接使用 cin/cout 输入输出。
样例一
input
2 3 1 2 2 3
output
4
样例二
input
9 15 2 3 5 7 11 13 17 23 29 4 5 4 1 2 4 6 1 3
output
10
样例三
见样例数据下载。限制与约定
测试点编号 | 数据规模 | 特殊限制 |
---|---|---|
1 | n≤100n≤100,t≤1000t≤1000 | xi≤1000xi≤1000 |
2 | ||
3 | ||
4 | n≤105n≤105,t≤1018t≤1018 | ai=1ai=1 |
5 | ||
6 | xi=ixi=i | |
7 | ||
8 | \ | |
9 | n≤5×105n≤5×105,t≤1018t≤1018 | |
10 |
时间限制:1s1s
空间限制:256MB256MB
下载
样例数据下载如果选定了堆积位置,那么一定是选距离这个位置近的积木往这儿堆
二分答案mid
计算 在某个位置堆mid个积木 的最少花费时间
计算时,先算出往位置1堆mid个积木 要用的区间[l,r]
那么随着堆积位置的右移,这个所用区间也右移
那么就根据l,r 到当前堆积位置的距离,判断区间是否需要右移,直到区间不能右移、、
然后计算这个区间里的积木 移到堆积位置 的时间
列个式子 合并同类项 就可以很快算出来了
#include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; typedef long long LL; int n; LL t,pre ,sum ,a ,siz ,x ; LL read(LL &x) { x=0; char c=getchar(); while(c<'0' || c>'9') c=getchar(); while(c>='0' && c<='9') { x=x*10+c-'0'; c=getchar(); } } void print(LL ans) { if(ans/10) print(ans/10); putchar(ans%10+'0'); } LL cal(int mid,int l,int r) { LL tmp=0; tmp+=pre[r]-pre[mid]-x[mid]*(sum[r]-sum[mid]); tmp+=x[mid]*(sum[mid-1]-sum[l-1])-pre[mid-1]+pre[l-1]; tmp-=(a[r]-siz[r])*(x[r]-x[mid]); tmp-=(a[l]-siz[l])*(x[mid]-x[l]); return tmp<<1; } bool check(LL mid) { memset(siz,0,sizeof(siz)); int l=1,r=0; while(mid) { r++; siz[r]=min(a[r],mid); mid-=siz[r]; } if(cal(1,l,r)<=t) return true; LL tmp; for(int i=2;i<=n;i++) { while(x[r]-x[i]<x[i]-x[l]) { if(siz[r]==a[r]) { if(r<n) { r++; continue; } break; } tmp=min(a[r]-siz[r],siz[l]); siz[r]+=tmp; siz[l]-=tmp; if(!siz[l]) l++; } if(cal(i,l,r)<=t) return true; } return false; } int main() { scanf("%d",&n); read(t); for(int i=1;i<=n;i++) read(x[i]); for(int i=1;i<=n;i++) read(a[i]); for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]; pre[i]=pre[i-1]+x[i]*a[i]; } LL l=0,r=sum ,mid,ans=0; while(l<=r) { mid=l+r>>1; if(check(mid)) l=mid+1,ans=mid; else r=mid-1; } print(ans); }
相关文章推荐
- uoj #49. 【UR #3】铀仓库
- UOJ#49. 【UR #3】铀仓库
- UOJ 49 [UR #3]铀仓库
- UOJ#61. 【UR #5】怎样更有力气
- UOJ 180【UR #12】实验室外的攻防战
- 【UOJ169】【UR #11】元旦老人与数列
- UOJ187[UR#13]Ernd(斜率优化DP)
- UOJ #242. 【UR #16】破坏蛋糕
- UOJ 241. 【UR #16】破坏发射台 [矩阵乘法]
- UOJ【UR #12】实验室外的攻防战
- UOJ_21_【UR #1】缩进优化_数学
- UOJ 75 [UR #6]智商锁
- UOJ 133 [UR #9]电路手动分析
- 【UOJ】#241. 【UR #16】破坏发射台
- UOJ#152. 【UR #10】汉诺塔
- 【UOJ】#242. 【UR #16】破坏蛋糕
- 【UOJ】#49.铀仓库
- UOJ #60. 【UR #5】怎样提高智商
- UOJ 21 [UR #1]缩进优化
- 【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)