终于搞完了这乡里别题目
$
$
考虑一个 \(dp\) ,设 \(f[i]\) 表示最后一个匹配选 \((i,p[i])\) 的最小费用
首先我们考虑答案长什么样
假设根据 \(p[i]\) 排序 ,那么答案肯定是一些以 \(p[]\) 为下标的区间的费用的总和
如果 \(j\) 能够转移到 \(i\) ,那么 \(j\) 一定处于一个基于原数组下标递减的单调序列中,这个我们可以用一个单调栈维护
这个单调栈要使得栈中的最小值尽量小并且费用尽量小
所以我们就是要对于每一个 \(i\) 求出一个 \(j\) 使得:

  1. \(p[j]<p[i]\);
  2. \(j\) 处于 \(i\) 左侧的一个单调栈中;
  3. \(f[j]\) 最小;
    $
    $

那么这个东西要怎么处理?
这里上一波套路,线段树维护单调栈(相似题:[BZOJ2957] 楼房重建
以 \(p[]\) 为线段树下标,在线段树的每个区间维护一个单调栈,并在节点记录了两个东西:\(mj\),\(val\)(初值为 \(inf\))

  1. \(val\) 为该区间的最小费用;
  2. \(mj\) 为该区间的最大原数组下标;

对于一个 \(i\) ,\(f[i]\) 的初值为 \(c[i]\),如果 \(p[i]\) 大于当前记录的最小 \(p[]\) 的值 ,那么就用区间 \([1,p[i]]\) 的 \(val\) 来更新 \(f[i]\)
然后将新的 \((i,f[i])\) 插入 \(p[i]\) 节点来更新线段树以及单调栈
举个栗子(样例):
\(Minp=inf\);
\(i=1,p[i]=3,f[i]=3,Minp=3\)
线段树叶子节点中存的原数组下标:\(\{inf,inf,1,inf,inf\}\)

\(i=2,p[i]=1,f[i]=4,Minp=1\)
线段树叶子节点中存的原数组下标:\(\{2,inf,1,inf,inf\}\)
节点 \([1,2]\) 的单调栈更新为 \(\{2,1\}\),\(val=4\)
节点 \([1,3]\) 的单调栈更新为 \(\{2,1\}\),\(val=3\)(显然选 \(f[1]\) 会更优)

\(i=3,p[i]=4,f[i]=3,Minp=1\)
这时 \(p[i]>Minp\) 了,并且在 \([1,3]\) 中有单调递减的 \(\{2,1\}\) 可以为 \(f[i]\) 提供贡献,\(f[i]=3+3=6\)
插入 \(f[i]\) 后,节点 \([4,5]\) 中的单调栈更新为\(\{3\}\),\(val=6\),也就是说,\(p[i]>4\)的\(f[i]\)都由\(f[3]\)来转移
$
$
操作是这样,那么具体到底怎么实现呢?

  1. 首先是\(query\),对于一个区间,右子树的答案一定是可行的(因为节点的答案插入前已经用左边的答案更新过),
    但是右子树的答案不一定是最优的(如果我们能在左子树内找到一个匹配\((i,p[i])\),使得 i 大于右子树内的 \(mj\),那么选择这个匹配可能会比右子树的答案更优),所以我们调用这样一个函数 \(calc(x<<1,Max)\),\(Max\)为右子树的 \(mj\),即在左子树内寻找一个更优的解,下面会讲
  2. 然后是更新(插入)。除了记 \(val\),\(mj\),我们还要记一个东西:\(lv\),表示之前提到的左子树能够提供的所谓更优的解(当然它有可能不是最优解)。显然,\(lv\) 就等于左子树的 \(calc\) 值
  3. \(calc\)。假设我们 \(calc\) 到一个节点 \(x\),如果它右子树的 \(mj\) 小于了 \(Max\),那么它的右子树对答案肯定是没有贡献的,我么只需要递归左子树;相反,如果它右子树的 \(mj\) 大于 \(Max\),那么它能够提供的贡献就是 \(lv\) 和 右儿子\(calc\)值的 \(min\)
  4. 然后是统计答案,从后往前统计答案,\(mx\)初值设为\(0\),每次找到一个 \(p[i]>mx\) 就拿\(ans\)和\(f[i]\)取\(min\)
    $
    $

下面是代码(这东西讲起来真的有点玄学,但代码还是好理解的),这道题确实有点\(SAO\),如果还不理解可以先去做一下[BZOJ2957] 楼房重建,做完应该就理解操作了:

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define inf (1<<30)
#define N (200010)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();
  if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }
il void File(){freopen("knows.in","r",stdin); freopen("knows.out","w",stdout);}

int n,ans,p[N],c[N],f[N];
struct node{int lv,val,mj;}t[N<<2];

il void init(){
   n=gi();
   for(int i=1;i<=n;i++) p[i]=gi();
   for(int i=1;i<=n;i++) c[i]=gi();
   for(int i=1;i<=n<<2;i++) t[i].val=t[i].lv=inf;
}

il int calc(int x,int l,int r,int Max){
   if(l==r) return t[x].mj>Max?t[x].val:inf;
   int mid=(l+r)>>1;
   if(t[x<<1|1].mj<=Max) return calc(x<<1,l,mid,Max);
   else return min(t[x].lv,calc(x<<1|1,mid+1,r,Max));
}

il pair<int,int> query(int x,int l,int r,int k){
   if(l==r) return make_pair(inf,0);
   int mid=(l+r)>>1;
   if(k<=mid) return query(x<<1,l,mid,k);
   else{
      pair<int,int>v=query(x<<1|1,mid+1,r,k);
      return make_pair(min(v.first,calc(x<<1,l,mid,v.second)),max(t[x<<1].mj,v.second));
   }
}

il void update(int x,int l,int r,int k,int newj,int val){
   if(l==r){ t[x].mj=newj,t[x].val=val; return ; }
   int mid=(l+r)>>1;
   if(k<=mid) update(x<<1,l,mid,k,newj,val);
   else update(x<<1|1,mid+1,r,k,newj,val);
   t[x].lv=calc(x<<1,l,mid,t[x<<1|1].mj);
   t[x].mj=max(t[x<<1].mj,t[x<<1|1].mj);
   t[x].val=min(t[x<<1].val,t[x<<1|1].val);
}

il void work(){
   int P=inf;
   for(int i=1;i<=n;i++){
      f[i]=c[i]; P=min(P,p[i]);
      if(p[i]>P) f[i]+=query(1,1,n,p[i]).first;
      update(1,1,n,p[i],i,f[i]);
   }
   P=0,ans=inf;
   for(int i=n;i;i--) if(p[i]>P) P=p[i],ans=min(ans,f[i]);
   printf("%d\n",ans);
}

int main(){ File(); init(); work(); return 0; }

[JZOJ 5402] God Knows的更多相关文章

  1. hdoj 5402 Travelling Salesman Problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 类似于黑白棋盘,有的格子是可以不走的,有的格子是不能不走的,对于m或n中有一个奇数的情况, 所有 ...

  2. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  3. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  4. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  5. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  6. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  7. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  8. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  9. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

随机推荐

  1. TensorFlow(1):使用Docker镜像搭建TensorFlow环境

    1,关于TensorFlow TensorFlow 随着AlphaGo的胜利也火了起来. google又一次成为大家膜拜的大神了.google大神在引导这机器学习的方向. 同时docker 也是一个非 ...

  2. Exp5

    实验 实验1 - 直接攻击系统开启的漏洞服务,获取系统控制权 1.选择要使用的模块 在这里我选择的模块是ms08_067 首先我们需要查询一下有关ms08_067所在模块的相关信息 search ms ...

  3. 20155320 EXP8 Web基础

    20155320 EXP8 Web基础 [基础问题回答] 什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单由文本域.复选框.单选框.菜单.文件地址域.按钮等 ...

  4. 20155338课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现

    课程设计个人报告--基于ARM实验箱的Android交友软件的设计与实现 个人贡献 实验环境的搭建 代码调试 在电脑上成功运行 研究程序代码撰写小组报告 一.实验环境 1.Eclipse软件开发环境: ...

  5. UCOSII笔记---信号量、邮箱、消息队列、信号量集、软件定时器

    一.接收邮箱函数的参数:timeout表示的是滴答定时器的节拍数,比如设定5ms为一个节拍,超时为100ms,则timeout=20. void *OSMboxPend (OS_EVENT *peve ...

  6. JavaScript闭包简单应用

    闭包定义 在JavaScript中,当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包.简单说,闭包就是能够读取其他函数内部变量的函数. 闭包的作用: 1. 可以读取函数内部的变量 2. 让 ...

  7. SSISDB4:当前正在运行的Package及其Executable

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  8. SSIS 包配置

    在商业智能解决方案中,SSIS工程有两种部署模式:工程部署(project deployment)和包部署(package deployment),默认是工程部署模式,在Package的管理上,工程部 ...

  9. [摘抄]从 GitHub 身上学到的 3 个创业经验

    1.找一个大问题去解决 让 Git 更容易使用是 GitHub 的目标,但它从来不是 GitHub 的最终目标.GitHub 的真正目标是让协作和编写软件变得更容易.世界上每一个软件开发者都在努力解决 ...

  10. 【原创】梵高油画用深度卷积神经网络迭代10万次是什么效果? A neural style of convolutional neural networks

    作为一个脱离了低级趣味的码农,春节假期闲来无事,决定做一些有意思的事情打发时间,碰巧看到这篇论文: A neural style of convolutional neural networks,译作 ...