题解 \(by\;zj\varphi\)

对于这道题,不难想到可以用 \(dp\),就是求一个最小权极长上升子序列

设 \(dp_i\) 表示最后一个选 \(i\) 时,覆盖前 \(i\) 条边的最小花费,设 \(\rm l_i\) 表示第 \(\rm i\) 条边前第一个 \(p\) 比 \(i\) 小的位置

那么能对 \(dp_i\) 转移的就是从 \(\rm l_i\) 往前的 \(p\) 上升的序列,这个东西要暴力转移的话,会达到 \(n^2\)

考虑线段树优化单调栈,用一棵线段树 \(log^2n\) 维护,具体如何请看代码

Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
static const int N=2e5+7,INF=1e9+7;
int dp[N],p[N],c[N],rmx,tmp,n,ans=INF;
struct Seg{
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
struct segmenttree{int mx,mn;segmenttree(){mn=INF;}}T[N<<2];
int calc(int x,int l,int r,int w) {
if (T[x].mx<=w) return INF; //记录一个 mx表示区间最大的 i,如果区间最大都不比限制大,那么直接返回
if (l==r) return dp[T[x].mx];
int mid(l+r>>1);
if (T[rs(x)].mx<w) return calc(ls(x),l,mid,w);//如果右区间不可以,就寻找左区间
return cmin(T[x].mn,calc(rs(x),mid+1,r,w));//记录一个 mn 表示,当前节点在右儿子 mx 的限制下,左儿子的贡献
}
int query(int x,int lt,int rt,int l,int r) {
if (l<=lt&&rt<=r)
return tmp=rmx,rmx=cmax(rmx,T[x].mx),calc(x,lt,rt,tmp);//找到一段区间,询问
int mid(lt+rt>>1),res(INF);
if (r>mid) res=cmin(res,query(rs(x),mid+1,rt,l,r));//一定要先找右儿子,更新 rmx 这个限制
if (l<=mid) res=cmin(res,query(ls(x),lt,mid,l,r));
return res;
}
void update(int x,int k,int p,int l,int r) {
if (l==r) return (void)(T[x].mx=k);
int mid(l+r>>1);
if (p<=mid) update(ls(x),k,p,l,mid);
else update(rs(x),k,p,mid+1,r);
T[x].mn=calc(ls(x),l,mid,T[rs(x)].mx);//更新时记得更 mn
T[x].mx=cmax(T[ls(x)].mx,T[rs(x)].mx);
}
}T;//这样可以保证线段树是每次递归左右儿子中的一个,复杂度 log^2n
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n);
for (ri i(1);i<=n;p(i)) read(p[i]);
for (ri i(1);i<=n;p(i)) read(c[i]);
for (ri i(1);i<=n;p(i)) {
rmx=0;
dp[i]=((tmp=T.query(1,1,n,1,p[i]))<INF?tmp:0)+c[i];
T.update(1,i,p[i],1,n);
}
for (ri i(n),mx(0);i;--i) if (p[i]>mx) ans=cmin(ans,dp[i]),mx=p[i];
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

NOIP 模拟 $16\; \rm God Knows$的更多相关文章

  1. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...

  2. NOIP 模拟 $16\; \rm Star Way To Heaven$

    题解 \(by\;zj\varphi\) 看懂题!!! 从最左穿到最右,一定会经过两个星星之间或星星和边界之间,那么我们穿过时当前最优一定是走中点 而我们要求最小的距离最大,那么我们将所有星星和边界( ...

  3. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  4. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  5. NOIP 模拟 $22\; \rm f$

    题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的 ...

  6. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...

  7. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  8. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  9. 20190725 NOIP模拟8

    今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...

随机推荐

  1. Xshell怎么连接数据库

    之前一直用Navicat Premium链接数据库,其实在xshell也可以链接数据库,本文将先介绍如何用xshell链接数据库的方法. 1.打开xshell,连接上 输入指令:mysql -h 19 ...

  2. Js中的防抖与节流函数

    1.何为防抖与节流函数呢? 1.防抖(debounce):通过setTimeout方式,在一定的时间间隔内,将多次触发的事件转化为一次触发.也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于 ...

  3. SEO优化:如何挖掘关键词谷歌篇

    最近SEO禅在做安卓项目比较忙,大部分入门理论的文章也写了差不多了,有的也写了一个系列,但是感觉还是不够完善,有很多边边角角的地方感觉也没说清楚,所以还是有必要写一些零散文章去补充说明下,就比如关于S ...

  4. 「AGC023D」 Go Home

    「AGC023D」 Go Home 传送门 神题. 首先我们可以倒着考虑. 当车到达最后一栋楼的时候,车上一定只有到这栋楼的员工. 当车到达倒数第二栋楼的时候,车上一定只有到达剩下两栋楼的员工. 设这 ...

  5. Github Copilot 结合python的使用

    之前提交的github copilot技术预览版申请,今天收到准入邮件,于是安上试一试这个准备把我送去电子厂上班的copy a lot ? 官网及申请地址:https://copilot.github ...

  6. __schedule的一些小细节

    (代码主要参考5.10) 1. __schedule的参数preempt static void __sched notrace __schedule(bool preempt) preempt是一个 ...

  7. Vue.js源码解析-Vue初始化流程之动态创建DOM

    目录 前言 一._update 如何判断是初始化还是更新操作? 二.patch 2.1 patch 定义 2.2 初始化的 patch 三.createElm 动态创建DOM 3.1 创建组件节点 3 ...

  8. python之数据驱动ddt操作(方法二)

    import unittestfrom ddt import ddt,unpack,datafrom selenium import webdriverfrom selenium.webdriver. ...

  9. powerdesigner连接postgresql数据库生成pdm及word文档

    1.准备软件: powerdesigner165与postgresql的驱动:psqlodbc_11_01_0000 2.安装并破解完成powerdesigner165 参看链接:https://ww ...

  10. Docker简易安装教程

    Docker介绍 Docker 是一种开源容器化技术,用于构建和容器化应用程序.Docker 使用客户端-服务器架构.Docker客户端与 Docker守护进程对话,后者负责构建.运行和分发 Dock ...