1473. [Ioi2000]Post加强版 n log^2 n做法
1473. [Ioi2000]Post加强版 n log^2 n做法
题面
有n个城市从负方向向正方向按照1至n标号,\(d[i]\)表示城市i离原点的距离并且\(d[1] = 0\),对于\(i \ne j\)有\(d[i] \ne d[j]\)。城市\(i\)里的居民人数为\(w[i]\),如果每个居民的信件需要投放到\(dis\)以外的邮局去,那么政府为了该城市的居民投放信件将总花费\(w[i] * dis\)的资金。另外,在城市\(i\)建立邮局的费用为\(c[i]\)。 找出一种方案,使得总花费最小。
是一道好题,但是如果只写\(n^2\)就是一道裸题了
\(subtask1 : n \leq 1000\)
int n;
ll c[N],w[N],d[N],ds[N],s[N];
ll dp[N];
int main() {
n=rd();
rep(i,1,n) d[i]=rd();
rep(i,1,n) c[i]=rd();
rep(i,1,n) w[i]=rd();
d[0]=-1e9;
d[n+1]=1e9;
rep(i,1,n+1) {
ds[i]=ds[i-1]+d[i]*w[i];
s[i]=s[i-1]+w[i];
}
int pre=0;
rep(i,1,n+1) {
dp[i]=1e15;
int mid=i;
drep(j,i-1,pre) {
while(mid>=j && d[i]-d[mid] <= d[mid]-d[j]) mid--;
ll t=dp[j];
t+=d[i]*(s[i]-s[mid])-(ds[i]-ds[mid]);
t+=ds[mid]-ds[j]-(s[mid]-s[j])*d[j];
if(t<dp[i]) dp[i]=t,pre=j;
}
dp[i]+=c[i];
}
printf("%lld\n",dp[n+1]);
}
拓展!!!
\(subtask2 : n \leq 10^5\)
决策单调性求解
单调性比较明显:对于每一个\(i\),决策点为\(j\),那么有随着\(i\)的递增,\(j\)也递增
但是受于转移顺序的限制,我们无法直接套用分治单调性求解
那么如何做呢?
我们再套一层分治!
第一层分治,我们考虑\([l,mid]\)中的dp值对于\([mid+1,r]\)中\(dp\)值的贡献
第二层分治,用于完成上述问题
注意一下调用顺序
#include<cstdio>
#include<cctype>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)
char IO;
int rd(){
int s=0,f=0;
while(!isdigit(IO=getchar())) if(IO=='-') f=1;
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
}
const int N=3e5+10;
int n;
ll c[N],w[N],d[N],ds[N],s[N];
ll dp[N];
int pos[N];
void Solve2(int l,int r,int L,int R) {
if(l>r) return;
int mid=(l+r)>>1;
ll mi=1e18,id=-1;
rep(i,L,R) {
int p=pos[(d[i]+d[mid])/2];
ll t=dp[i]+c[mid]+(ds[p]-ds[i])-d[i]*(s[p]-s[i])+d[mid]*(s[mid]-s[p])-(ds[mid]-ds[p]);
if(mi>t) mi=t,id=i;
}
dp[mid]=min(dp[mid],mi);
if(id==-1) return;
Solve2(l,mid-1,L,id);
Solve2(mid+1,r,id,R);
}
void Solve1(int l,int r) {
if(l==r) return;
int mid=(l+r)>>1;
Solve1(l,mid);
Solve2(mid+1,r,l,mid+1);
Solve1(mid+1,r);
}
int main() {
n=rd();
rep(i,1,n) d[i]=rd();
rep(i,1,n) c[i]=rd();
int p=1;
rep(i,0,3e5) if(d[p]==i) pos[i]=p,p++;
else pos[i]=pos[i-1];
rep(i,1,n) w[i]=rd();
rep(i,1,n) {
ds[i]=ds[i-1]+d[i]*w[i];
s[i]=s[i-1]+w[i];
}
rep(i,1,n) dp[i]=d[i]*s[i]-ds[i]+c[i];
Solve1(1,n);
ll ans=1e18;
rep(i,1,n) ans=min(ans,dp[i]+(ds[n]-ds[i])-d[i]*(s[n]-s[i]));
printf("%lld\n",ans);
}
1473. [Ioi2000]Post加强版 n log^2 n做法的更多相关文章
- Android安全–加强版Smali Log注入
有的时候我们需要注入smali调用Log输出,打印字符串的值. 比如说: 如果我们要打印下面v1的值. new-instance v1, Ljava/lang/String; const-string ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POJ 2533 Longest Ordered Subsequence LCS O(n*log(n))
题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #define SIZE 1001 using namespace ...
- 解读Android LOG机制的实现【转】
转自:http://www.cnblogs.com/hoys/archive/2011/09/30/2196199.html http://armboard.taobao.com/ Android提供 ...
- POJ 2533 Longest Ordered Subsequence LIS O(n*log(n))
题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #include <algorithm> using ...
- 决策单调性&wqs二分
其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...
- 2018HN省队集训
HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...
- 2017FJ省队集训 游记
2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...
- NOIP2016考前做题(口胡)记录
NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...
随机推荐
- Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)
简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...
- Qt 的两个许可证区别分析:LGPL 和商业协议
Qt 的两个许可证区别分析:LGPL 和商业协议 Qt 有两个许可证:LGPL 和商业协议.这两个协议在现在的 Qt 版本中的代码是完全一致的(潜在含义是,Qt 的早期版本,商业版的 Qt 通常包含有 ...
- Application类-多窗口交互
我们在派生自Application类中出来放置响应应用程序事件的代码外,还可以放置一些完成其他任务的代码. 在此之前要知道: 如何获取应用程序的Application对象: //App是一个继承自Ap ...
- .Net Core实战教程(二):设置Kestrel的IP与端口的几种方法
.Net Core实战教程(二):设置Kestrel的IP与端口的几种方法 1.直接写在代码方式 Program.cs代码如下: using System; using System.Collecti ...
- PIE SDK Alpha通道数据渲染
1. 功能简介 在计算机图形学中,一个RGB颜色模型的真彩图形,用由红.绿.蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息.为实现图形的透明效果,采取在图形文件的 ...
- 4-rocketmq 发送时异常:system busy 和 broker busy 解决方案
原文:https://www.cnblogs.com/enenen/p/10138511.html 推荐阅读:https://juejin.im/post/5d996285f265da5bad4052 ...
- Python【day 9】函数入门1
1.什么是函数 函数的概念:对功能或者动作的封装 函数的好处:避免重复代码 2.函数的定义 1.函数的定义 def 函数名(形参列表): 函数体(return) 2.函数的调用 函数名(实参列表) 3 ...
- javascript高级程序设计学习历程
第三章 基本概念 3.1 语法 3.1.1 区分大小写 ECMAScript中的一切(变量,函数,操作符)都区分大小写的 3.1.2 标识符 标识符:变量,函数,属性的名字以及函数的参数. 标识符的命 ...
- android studio学习---Lint工具
对代码进行测试是一回事,但同样重要的是.我们还需要在编写代码的同时引入各种最佳实践.这不仅能够显著改进性能表现,也能增加应用程序的整体稳定性.另外,经过合理结构调整的项目在维护方面也更为轻松. And ...
- 基于开源博客系统(mblog)搭建网站
基于开源博客系统(mblog)搭建网站 上一章讲了基于jpress部署的博客系统,这一章了解一下 mblog这个开源的基于springboot的博客系统,相比与jpress 的热度fork数量要少一些 ...