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. Eureka和ZooKeeper的区别

    首先我们先说下: RDBMS==>(MySql,Oracle,SqlServer等关系型数据库)遵循的原则是:ACID原则(A:原子性.C:一致性.I:独立性.D:持久性.). NoSql==& ...

  2. 深入V8引擎-AST(6)

    花了5篇才把一个字符串词法给解析完,不知道要多久才能刷完整个流程,GC.复杂数据类型的V8实现那些估计又是几十篇,天呐,真是给自己挖了个大坑. 前面几篇实际上只是执行了scanner.Initiali ...

  3. 解决Hangfire 导致服务器内存飙涨

    最近因为项目需要调度作业服务,之前看张队推荐过一篇https://www.cnblogs.com/yudongdong/p/10942028.html 故直接拿过来实操,发现很好用,简单.方便  执行 ...

  4. mvc5 源码解析2-1:mvchandler的执行

    上一节说在urlroutingmodule中mvchandler 映射到httpcontext上,那mvchandler又是怎么执行的呢? (1).httpruntime 从isapiruntime  ...

  5. Python - Win10系统下Python3.x环境配置

    Win10系统下Python3.x环境配置 https://blog.csdn.net/qq_41952474/article/details/82630551

  6. 【转载】C#中Datatable修改列名

    在C#的数据表格DataTable操作过程中,有时候会遇到修改DataTable数据表格的列名的需求,其实C#中的DataTable的列名支持手动修改调整,可以通过DataTable类的Columns ...

  7. Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088) 复现

    漏洞复现 直接写 shell 写 shell 的话,需要写在 admin 或者 api 中,也就是需要登录,没有密码的话完成不了写 shell 操作. 该环境默认的口令为 admin/admin. 访 ...

  8. JavaScript 总结[目录]

    ECMAScript 基础 一.JavaScript 基础 1.1 JavaScript 简介 1.2 JavaScript 书写位置 二.JavaScript 数据类型 2.1 JavaScript ...

  9. 隐马尔科夫模型(Hidden Markov Models) 系列之四

    转自:http://blog.csdn.net/eaglex/article/details/6430389 前向算法(Forward Algorithm) 一.如果计算一个可观察序列的概率?   1 ...

  10. 英语AmbraGrisea龙涎香

    龙涎香AmbraGrisea是抹香鲸科动物抹香鲸的肠内分泌物的干燥品.取自宰杀的抹香鲸肠内分泌物(即鲸鱼的粪便,它是抹香鲸吞食墨鱼后,胃肠道分泌出来的灰黑色的蜡状排泄物).其味甘.气腥.性涩,具有行气 ...