[日常训练] God Knows
来源:互联网 发布:大数据上市公司有几家 编辑:程序博客网 时间:2024/06/06 19:15
分析 DP + 线段树优化
40pts
- 把问题转化为求极长不下降子序列(就是不能在选出的子序列中插入别的元素使序列更长,否则我们就无法删去所有边)中的最小花费
- 于是我们可以设
F[i] 表示以i 开头的极长不下降子序列的最小花费,则转移方程为F[i]=min(F[j]+ci)(i<j≤n) (为了方便下面的说明这里的i 是从n 开始倒着循环,且j 满足不存在k(i<k<j) ,使得ci<ck<cj ) - 那么就可以从
i+1 开始转移,用一个变量记录当前大于ci 的最小代价来判断是否存在上述的k ,时间复杂度为O(n2)
100pts
- 首先把每个二元组
(pi,i) 看做平面直角坐标系中的点,那么对于i 合法的转移点就是横坐标范围为[pi+1,n] ,且随横坐标递增,纵坐标不断递减的点 - 因此以
pi 为下标维护一棵线段树,分别记录每个区间的最小合法i 值y 和最小合法F 值f - 先考虑询问,每次会通过线段树把
[pi+1,n] 分成若干个区间,显然我们要从左往右合并信息来保证极长,那么如何合并呢? - 定义一个函数
Ask(s,y) ,表示在线段树节点s 的区间内,纵坐标小于y (y 是把之前的区间都合并完后的最小i 值)的f 值(为表示方便,令"+" 为将两个区间y 和f 的信息合并,即都取最小)- 当
s 为叶节点,直接判断是否可转移 - 当
ysL<y 时,左区间存在可转移的点,则Ask(s,y)=Ask(sL,y)+Ask(sR,ysL) - 当
ysL>y 时,Ask(s,i)=Ask(sR,i)
- 当
- 我们发现
Ask(sR,ysL) 与y 值无关,因此也作为区间维护的信息保存下来,就降低了复杂度 - 接着我们考虑如何维护,记
Ask(sR,ysL) 返回信息为Q ,原本我们维护的y 和f 为P ,那么Ps=PsL+Qs - 最后对于修改,我们只要把对应
pi 上的P 修改下,再按照上述操作更新相关区间的P,Q 即可,总复杂度为O(nlog2n)
代码
#include <iostream>#include <cstdio>#include <cstring>#include <cctype>#include <algorithm>using namespace std;namespace INOUT{ const int S = 1 << 20; char frd[S], *hed = frd + S; const char *tal = hed; inline char nxtChar() { if (hed == tal) fread(frd, 1, S, stdin), hed = frd; return *hed++; } inline int get() { char ch; int res = 0; bool flag = false; while (!isdigit(ch = nxtChar()) && ch != '-'); (ch == '-' ? flag = true : res = ch ^ 48); while (isdigit(ch = nxtChar())) res = res * 10 + ch - 48; return flag ? -res : res; } };using namespace INOUT;inline int Min(int x, int y) {return x < y ? x : y;}struct section{ int y, f; section() {} section(const int &Y, const int &F): y(Y), f(F) {} friend inline section Merge(const section &a, const section &b) { return section(Min(a.y, b.y), Min(a.f, b.f)); }};const int N = 2e5 + 5, M = N << 2;section p[M], q[M], Ans; int f[N], C[N], P[N], n;const int Maxn = 0x3f3f3f3f;const section INF = section(Maxn, Maxn);#define sL s << 1#define sR s << 1 | 1inline section Ask(int s, int l, int r, int y){ if (l == r) return p[s].y < y ? p[s] : INF; int mid = l + r >> 1; if (p[sL].y < y) return Merge(Ask(sL, l, mid, y), q[s]); else return Ask(sR, mid + 1, r, y);}inline void Update(int s, int l, int r){ int mid = l + r >> 1; q[s] = Ask(sR, mid + 1, r, p[sL].y); p[s] = Merge(p[sL], q[s]);}inline void Modify(int s, int l, int r, int x, int y, int f){ if (l == r) return (void)(p[s] = section(y, f)); int mid = l + r >> 1; if (x <= mid) Modify(sL, l, mid, x, y, f); else Modify(sR, mid + 1, r, x, y, f); Update(s, l, r);}inline void Query(int s, int l, int r, int x, int y){ if (l == x && r == y) return (void)(Ans = Merge(Ans, Ask(s, l, r, Ans.y))); int mid = l + r >> 1; if (y <= mid) Query(sL, l, mid, x, y); else if (x > mid) Query(sR, mid + 1, r, x, y); else { Query(sL, l, mid, x, mid); Query(sR, mid + 1, r, mid + 1, y); }}inline void Build(int s, int l, int r){ p[s] = q[s] = INF; if (l == r) return; int mid = l + r >> 1; Build(sL, l, mid); Build(sR, mid + 1, r);}int main(){ freopen("knows.in", "r", stdin); freopen("knows.out", "w", stdout); n = get(); for (int i = 1; i <= n; ++i) P[i] = get(); for (int i = 1; i <= n; ++i) C[i] = get(); P[0] = 1; Build(1, 1, n); for (int i = n; i >= 0; --i) { Ans = INF; Query(1, 1, n, P[i], n); f[i] = Ans.f == Maxn ? C[i] : Ans.f + C[i]; Modify(1, 1, n, P[i], i, f[i]); } printf("%d\n", f[0]); fclose(stdin); fclose(stdout); return 0;}
阅读全文
1 0
- [日常训练] God Knows
- 【JZOJ5402】God Knows
- 线段树 God Knows
- UESTC 8 God Only Knows!
- God knows how I miss him!
- [CDOJ 8] God Only Knows! [AC自动机]
- UESTC 8 God Only Knows! AC自动机
- God Knows 线段树维护单调栈
- 【JZOJ 5402】【NOIP2017提高A组模拟10.8】God Knows
- 【线段树维护单调栈】【JZOJ 5402】 God Knows
- jzoj5402 【NOIP2017提高A组模拟10.8】God Knows
- [JZOJ5402]【NOIP2017提高A组模拟10.8】God Knows (口胡)
- 【WinterCamp 2013】楼房重建 && 【NOIP2017提高A组模拟10.8】God Knows
- GOD
- HEU日常训练10.02
- 日常训练小结
- 日常训练20161012 道路网
- 日常训练20161012 醉酒
- 链表反转
- 《机器学习实战》笔记之七——利用AdaBoost元算法提高分类性能
- JS特殊函数(Function()构造函数、函数直接量)区别介绍
- Spring源码分析——BeanFactory体系之接口详细分析
- Java并发编程札记-(五)JUC容器-02CopyOnWrite
- [日常训练] God Knows
- Imagenomic Professional Plugin Suite for Mac(ps磨皮降噪滤镜套装)附注册码 v1414破解版
- 放弃sublime,使用intellij编写react native
- Java入门之Java简介
- 模拟退火初探--POJ 2069 Super Star
- 《机器学习实战》笔记之七——利用AdaBoost元算法提高分类性能
- 飞行员配对方案问题(网络流二十四题T1)
- ROS配置<二>:创建ROS工作空间
- 小知识 | 机器学习:不得不知的概念(3)