NOIP 模拟 $16\; \rm God Knows$
题解 \(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$的更多相关文章
- NOIP 模拟 $16\; \rm Lost My Music$
题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...
- NOIP 模拟 $16\; \rm Star Way To Heaven$
题解 \(by\;zj\varphi\) 看懂题!!! 从最左穿到最右,一定会经过两个星星之间或星星和边界之间,那么我们穿过时当前最优一定是走中点 而我们要求最小的距离最大,那么我们将所有星星和边界( ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- NOIP 模拟 $22\; \rm f$
题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的 ...
- 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]:选 ...
- NOIP模拟3
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
- 7.22 NOIP模拟7
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...
- 20190725 NOIP模拟8
今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...
随机推荐
- Flink进入大厂面试准备,收藏这一篇就够了
1. Flink 的容错机制(checkpoint) Checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态 ...
- Mybatis代码自动生成(含测试)
一.建立数据库 create database shixun; use shixun; create table user( id int primary key auto_increment , u ...
- [Qt]-打包程序为Debian的deb格式的安装包
参考:https://segmentfault.com/a/1190000005029385 参考:UnityLaunchersAndDesktopFiles deb是Debian Linux的软件包 ...
- C语言:编译具体过程及隐藏
对于平常应用程序的开发,很少有人会关注编译和链接的过程,因为我们使用的工具一般都是流行的集成开发环境(IDE),比如 Visual Studio.Dev C++.C-Free 等.这些功能强大的 ID ...
- __schedule的一些小细节
(代码主要参考5.10) 1. __schedule的参数preempt static void __sched notrace __schedule(bool preempt) preempt是一个 ...
- Unittest方法 -- 测试分离
一.下面是it.py 脚本,把浏览器前置和后置条件分离了"""套件公用测试类可进行分离"""import unittestfrom sele ...
- Oracle19c 如何用rman duplicate 克隆一个数据库。(Active方式)
Oracle19c 如何用rman duplicate 克隆一个数据库. 首先克隆有两种方法,一种是Backup-Based,一种是Active方式.官网文档链接https://docs.oracle ...
- CSP-S 2020 初赛
游记 游记个鬼啊跨条街就到了=-= 不分Day反正就一天. 9:30开考,8:30起床. 下雨了,一出宿舍门整个学校全被白色的雾气笼罩.愚以为这是祥瑞之气,昨夜似有麒麟貔貅路过,祝我今日初赛RP++ ...
- python框架之Flask
介绍:Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . WSGl:Web Server Gateway ...
- 第三篇--如何修改exe文件版本号和文件信息
控制台程序添加版本信息方法: 项目右键 Add-->Resource-->选择Version-->new,然后就可以修改里面的信息了,重新编译一下就OK.