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做法的更多相关文章

  1. Android安全–加强版Smali Log注入

    有的时候我们需要注入smali调用Log输出,打印字符串的值. 比如说: 如果我们要打印下面v1的值. new-instance v1, Ljava/lang/String; const-string ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. POJ 2533 Longest Ordered Subsequence LCS O(n*log(n))

    题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #define SIZE 1001 using namespace ...

  4. 解读Android LOG机制的实现【转】

    转自:http://www.cnblogs.com/hoys/archive/2011/09/30/2196199.html http://armboard.taobao.com/ Android提供 ...

  5. POJ 2533 Longest Ordered Subsequence LIS O(n*log(n))

    题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #include <algorithm> using ...

  6. 决策单调性&wqs二分

    其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...

  7. 2018HN省队集训

    HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...

  8. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

  9. NOIP2016考前做题(口胡)记录

    NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...

随机推荐

  1. tomcat 下 base64图片上传超过2m的解决方案

    方案一: tomcat部署下默认post请求提交参数大小为2M左右,超过这个大小,就会传值不成功 要使post请求参数无大小限制,需要在server.xml上修改,如下: <Connector ...

  2. python网络爬虫(1)——安装scrapy框架的常见问题及其解决方法

    Scrapy是为了爬取网站数据而编写的一款应用框架,出名,强大.所谓的框架其实就是一个集成了相应的功能且具有很强通用性的项目模板. 其实在Linux和 Mac安装,就简单的pip命令即可: pip i ...

  3. 在Jenkins远程链接Linux系统,然后执行shell命令-亲测可用【转】

    版权声明:本文为博主原创文章,未经博主允许不得转载.部分为转载其他人的,如要使用,也请提前通知一声 https://blog.csdn.net/a136332462/article/details/7 ...

  4. mosquitto 常用命令

    原文:https://www.cnblogs.com/smartlife/articles/10182136.html 常用命令 订阅主题 mosquitto_sub -h 192.168.0.1 - ...

  5. sonarqube+sonar runner分析C#代码

    最近研究一个代码覆盖率和代码分析工具.遇到一些比较坑的问题,现在分享给大家. 1.Sonar介绍 Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量.通过插件机制,Sonar 可 ...

  6. 基于YOLO3对图像加框的函数draw_image()

    def draw_bbox(image, bboxes, class_i, show_label=True): # 将中心点坐标与w,h通过变化为左上角与右下角坐标 bboxes_change = n ...

  7. 3.redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

    作者:中华石杉 面试题 redis 都有哪些数据类型?分别在哪些场景下使用比较合适? 面试官心理分析 除非是面试官感觉看你简历,是工作 3 年以内的比较初级的同学,可能对技术没有很深入的研究,面试官才 ...

  8. angular6 页面加载数据时的loading提示

    使用npm安装ngx-loading模块 npm install --save ngx-loading 在app.module.ts中导入模块 import { BrowserModule } fro ...

  9. jupyter配置成coding神器

    参考链接: [1]http://resuly.me/2017/11/03/jupyter-config-for-windows/ [2]主题更换 切换主题:jt 主题名 -T 主题种类:chester ...

  10. 后缀自动机专题(hihocoder)

    传送门 #1445 : 后缀自动机二·重复旋律5 题意: 给出字符串\(s\),询问字符串\(s\)中有多少不同的子串. 思路: 考虑对\(s\)建后缀自动机,那么\(\sum (len[i]-len ...