NOIP 模拟 $14\; \text{队长快跑}$
题解 \(by\;zj\varphi\)
一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少
看到数据范围,直接想离散化
设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁的 \(A_i\) 的最小值为 \(j\) 时最多能摧毁多少。
分类讨论
当 \(A_i\le B_i\) 时,那么要使 \(A_i\) 为最小值,那么就要摧毁它,所以 \(dp_{i,A_i}=\max(dp_{i-1,B_i+1},...dp_{i-1,\max})+1\)
但前 \(i-1\) 个数也可能有 \(A_i\) 所以也可以不摧毁它,故 \(dp_{i,A_i}=\max(dp_{i,A_i},dp_{i-1,A_i})\)当 \(A_i>B_i\) 时,要使 \(A_i\) 为最小值,则 \(dp_{i,A_i}=\max(dp_{i-1,A_i+1},...dp_{i-1,\max})+1\),
且 \(j\in (B_i,A_i]\) 时,\(dp_{i,j}=dp_{i-1,j}+1\)。
对于第二种情况,我们要把其中的 \(dp_{i,A_i}\) 取最大值,至于为什么可以在不确定前 \(i\) 个数是否有 \(j\) 时就转移 \(j\)
是因为若没有 \(j\),\(dp_{i,A_i}\) 绝对不会劣于 \(dp_{i,j}\),所以 \(dp_{i,j}\) 的会被 \(dp_{i,A_i}\) 覆盖。
数据范围太大,无法直接转移,考虑线段树优化,转移的式子可以直接当作 单点修改,区间最大值,区间加法。
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 cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=1e5+7;
int a[N],b[N],tmpab[N<<1],n,ans,cnt;
struct Seg{
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define up(x) T[x].nm=cmax(T[ls(x)].nm,T[rs(x)].nm)
struct segmenttree{int lz,nm;}T[N<<3];
inline void down(int x) {
if (!T[x].lz) return;
int l=ls(x),r=rs(x);
T[l].nm+=T[x].lz,T[l].lz+=T[x].lz;
T[r].nm+=T[x].lz,T[r].lz+=T[x].lz;
T[x].lz=0;
}
void update(int x,int l,int r,int lt,int rt) {
if (l<=lt&&rt<=r) {p(T[x].nm),p(T[x].lz);return;}
int mid(lt+rt>>1);
down(x);
if (l<=mid) update(ls(x),l,r,lt,mid);
if (r>mid) update(rs(x),l,r,mid+1,rt);
up(x);
}
void updates(int x,int p,int k,int l,int r) {
if (l==r) {T[x].nm=cmax(T[x].nm,k);return;}
int mid(l+r>>1);
down(x);
if (p<=mid) updates(ls(x),p,k,l,mid);
else updates(rs(x),p,k,mid+1,r);
up(x);
}
int query(int x,int l,int r,int lt,int rt) {
if (l<=lt&&rt<=r) return T[x].nm;
int mid(lt+rt>>1),res(0);
down(x);
if (l<=mid) res=max(res,query(ls(x),l,r,lt,mid));
if (r>mid) res=max(res,query(rs(x),l,r,mid+1,rt));
return res;
}
}T;
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(a[i]),read(b[i]);
tmpab[p(cnt)]=a[i],tmpab[p(cnt)]=b[i];
}
sort(tmpab+1,tmpab+cnt+1);
ri kab=unique(tmpab+1,tmpab+cnt+1)-tmpab;
for (ri i(1);i<=n;p(i)) {
a[i]=lower_bound(tmpab+1,tmpab+kab,a[i])-tmpab;
b[i]=lower_bound(tmpab+1,tmpab+kab,b[i])-tmpab;
}
kab-=1;
for (ri i(1);i<=n;p(i)) {
int tmp=0;
if (a[i]<=b[i]) {
if (b[i]<kab) tmp=T.query(1,b[i]+1,kab,1,kab);
T.updates(1,a[i],tmp+1,1,kab);
} else {
T.update(1,b[i]+1,a[i],1,kab);
if (a[i]<kab) tmp=T.query(1,a[i]+1,kab,1,kab);
T.updates(1,a[i],tmp+1,1,kab);
}
}
printf("%d\n",T.T[1].nm);
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $14\; \text{队长快跑}$的更多相关文章
- NOIP模拟14「队长快跑·影魔·抛硬币」
T1:队长快跑 基本思路: 离散化·DP·数据结构优化DP 这三个我都没想到....气死. 定义状态数组:\(c[i][j]\)表示在i时最小的a值是j时可以摧毁的最多的水晶数. 那么 ...
- BZOJ4829: [Hnoi2017]队长快跑
BZOJ4829: [Hnoi2017]队长快跑 Description 众所周知,在P国外不远处盘踞着巨龙大Y. 传说中,在远古时代,巨龙大Y将P国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个P国的 ...
- [LOJ 2022]「AHOI / HNOI2017」队长快跑
[LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...
- NOIP 模拟 $14\; \text{抛硬币}$
题解 \(by\;\;zj\varphi\) 签到题,自己看题解 Code #include<bits/stdc++.h> #define ri register signed #defi ...
- NOIP 模拟 $14\; \text{影魔}$
题解 \(by\;\;zj\varphi\) 不是原题 一道(对我来说)很需要技巧的题 对于颜色数如何处理 离线,将子树转化为 \(dfs\) 序,但这种做法无法处理深度 我们按照深度加点(可以通过 ...
- Noip模拟14 2021.7.13
T1 队长快跑 本身dp就不强的小马看到这题并未反映过来是个dp(可能是跟题面太过于像那个黑题的队长快跑相似) 总之,基础dp也没搞出来,不过这题倒是启发了小马以后考试要往dp哪里想想 $dp_{i, ...
- HZOI20190908模拟40 队长快跑,影魔,抛硬币 题解
题面:https://www.cnblogs.com/Juve/articles/11487699.html 队长快跑: 权值线段树与dp yy的不错 #include<iostream> ...
- ServiceStack.Text 更快的序列化
Json.net 是以前最经常用的序列化组件,后来又注意到ServiceStack号称最快的,所以我做了以下测试 1)Json.net using System; using System.Colle ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
随机推荐
- 计算机基础 | 文档神器docsify安装及基本使用
为啥要用docsify? 神器Docsify让你的文档变得美观,配合typora,从此爱上看文档,各种优点:小巧.快速.美观.方便.快捷.上手快,可以浏览如下优秀案例 ve-charts pyecha ...
- 315M、433M和2.4G笔记
一.315M无线模块 315m无线模块广泛地运用在车辆监控.遥控.遥测.小型无线网络.无线抄表.门禁系统.小区传呼.工业数据采集系统.无线标签.身份识别.非接触RF智能卡.小型无线数据终端.安全防火系 ...
- Pytorch的模型加速方法:Dataparallel (DP) 和 DataparallelDistributedparallel (DDP)
Dataparallel 和 DataparallelDistributed 的区别 一.Dataparallel(DP) 1.1 Dartaparallel 的使用方式 Dataparallel 的 ...
- NTFS安全权限
一.NTFS权限概述 1.通过设置NTFS权限,实现不同的用户访问不同的对象的权限 2.分配了真确的访问权限后,用户才能访问其资源 3.设置权限防止资源被篡改.删除 二.文件系统概述 文件系统即在外部 ...
- C语言:变量定义
变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义.变量声明:用于向程序表明变量的类型和名字.定义也是声明,extern声明不是定义 定义也是声明:当定义变量时我们声 ...
- 论文阅读:Robust Visual SLAM with Point and Line Features
本文提出了使用异构点线特征的slam系统,继承了ORB-SLAM,包括双目匹配.帧追踪.局部地图.回环检测以及基于点线的BA.使用最少的参数对线特征采用标准正交表示,推导了线特征重投影误差的雅克比矩阵 ...
- 【学习笔记】Github的使用
在github上上传项目代码 在github官网上新建自己的仓库,需要写好标题和说明文件,然后复制自己的仓库地址 在要上传到的本地project中右键, Git bash here,接着输入 git ...
- lucene 类介绍
lucene中重要的类: IndexWriter:lucene中最重要的类之一,主要用于索引的创建 Analyzer(抽象类):分析器,主要用于分析文本,常用的有StandardAnalyzer分析器 ...
- Spring RestTemplate 之put、delete请求
●PUT请求:在RestTemplate中,PUT请求可以通过put方法调用,put方法的参数和前面介绍的postForEntity方法的参数基本一致,只是put方法没有返回值而已.举一个简单的例子, ...
- POJ1944
poj1944 一道我不会做的贪心题. (思维才是OI的重点) 但是if您也不会,那就来听我瞎扯吧. 首先,这个图是一个圈,只能连接邻点,使所有求的点联通. 我们先不考虑环,那么就可以想出一个假的做法 ...