luogu P3202 [HNOI2009]通往城堡之路
来源:互联网 发布:波司登淘宝旗舰店电话 编辑:程序博客网 时间:2024/04/30 13:04
就是把所有的都先设为最差值;
然后一点点的往上调;
然后就是贪心;
定义 :
low : 从n到现在i b[i]<=a[i] 的个数;
up : 从n到现在i b[i]>a[i] 的个数;
我们找一个 low-up 最大的后缀;
先上调;
调的距离是 min ( a[i]-b[i] ) |a[i]>b[i];
因为这样我们 up 增加的值可以用 low 增加的值来抵消;
而且会有一部分 low 的值会使 ans 减小;
所以最优;
但是上调距离有边界, 即前一个 b[i-1]+d < b[i];
所以 b[i] 上调的最大距离要和 b[i-1]+d-b[i] 取 min;
#include "iostream" #include "stdio.h" #include "algorithm" #define II int #define LO long long #define R register #define I 123456 using namespace std; II t,n; LO d; LO a[I], b[I]; LO gg(R LO x) { return x<0 ? -x : x ; } LO smaler(R LO a,R LO b) { return a<b ? a : b ; } int main() { scanf("%d",&t); while (t--) { scanf("%d%lld",&n,&d); for(R II i=1;i<=n;i++) scanf("%lld",&a[i]); if(gg(a[n]-a[1])>d*(n-1)) { printf("impossible\n"); continue ; } b[1]=a[1]; for(R II i=2;i<=n;i++) b[i]=b[i-1]-d; while (b[n]!=a[n]) { R LO low=0,up=0,wei,oo=-1e18,op=1e18, ko=0; for(R II i=n;i>1;i--) { a[i]>b[i] ? low++ : up++ ; if(a[i]>b[i]) { op=smaler(op,a[i]-b[i]); } if(low-up>=oo && b[i-1]+d!=b[i]) { oo=low-up; wei=i; ko=op; } } ko=smaler(ko,b[wei-1]+d-b[wei]); for(R II i=wei;i<=n;i++) b[i]+=ko; } R LO ans=0; for(R II i=1;i<=n;i++) ans+=gg(a[i]-b[i]); printf("%lld\n",ans); } exit(0); }
阅读全文
0 0
- luogu P3202 [HNOI2009]通往城堡之路
- [bzoj 1484] HNOI2009 通往城堡之路
- bzoj1484: [HNOI2009]通往城堡之路
- BZOJ 1484: [HNOI2009]通往城堡之路
- [乱搞] BZOJ 1484 [HNOI2009]通往城堡之路
- bzoj 1484 [HNOI2009]通往城堡之路 贪心
- hnoi 2009 通往城堡之路
- 通往阿里之路
- 通往大神之路
- 通往java高手之路
- 通往架构师之路
- Luogu P2910 寻宝之路
- 通往幸福之路之贷款篇
- 通往弹性软件架构之路
- 打破沙锅 ---通往网管之路
- 通往python之路(一)
- 通往测试架构师之路
- 通往测试架构师之路
- SSL2562 2016年提高组模拟试题 禅与园林艺术
- luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
- luogu P1484 种树
- oi解题策略
- Xcode9学习笔记25
- luogu P3202 [HNOI2009]通往城堡之路
- 简单fresco的实现
- [luogu模拟赛] 11.2
- lambda表达式
- spark-dataset
- 最近公共祖先:LCA及其用倍增实现 +POJ1986
- 语音转文本
- 每日一练(2017-11-03)
- Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别