题目背景

传说中,在远古时代,巨龙大$Y$将$P$国的镇国之宝窃走并藏在了其巢穴中,
这吸引着整个$P$国的所有冒险家前去夺回,尤其是皇家卫士队的队长小$W$。
在$P$国量子科技实验室的帮助下,队长小$W$通过量子传输进入了巨龙大$Y$的藏宝室,并成功夺回了镇国之宝。
但此时巨龙布下的攻击性防壁启动,将小$W$困在了美杜莎的迷宫当中。


题目传送门(内部题41)


输入格式

第一行一个数$n$,表示水晶的个数。
接下来的$n$行,每行两个数$A_i,B_i$,表示第$i$个位置上的水晶的属性值。


输出格式

输出只有一行,表示在避免机关爆炸的情况下小$W$最多能够摧毁的水晶个数。


样例

样例输入:

5
2 5
3 3
7 2
8 3
4 5

样例输出:

3


数据范围与提示

对于$30\%$的数据,满足$n\leqslant 10$。
对于$60\%$的数据,满足$n\leqslant 200$。
对于另$10\%$的数据,满足$A_i,B_i\leqslant 2$。
对于$100\%$的数据,满足$n\leqslant 100,000,1\leqslant A_i,B_i\leqslant {10}^9$。


题解

爆搜有$30$分,记忆化能跑到$60$,再加上特判$A_i,B_i\leqslant 2$的点,$70$分就到手了,出题人还是蛮仁慈的。

首先,$A_i,B_i$肯定要离散化。

我们要摧毁的肯定是一个连续的区间,所以对于这段合法区间,满足$B_max<A_min$。

那么考虑$DP$。

设$dp[i][j]$表示处理到第$i$个水晶,已经选择的水晶中最小的$A$为$S$的最大摧毁个数。

那么考虑如何转移,分两种情况:

  $\alpha.A_i\leqslant B_i$:$dp[i][A_i]=\max(dp[i-1][B_i+1],dp[i-1][B_i+2]...dp[i-1][MAX])+1$。

  $\beta.A_i>B_i$:

    $dp[i][A_i]=\max(dp[i-1][A_i+1],dp[i-1][A_i+2]...dp[i-1][MAX]+1$。

    $dp[i][j]=dp[i-1][j]+1,j\in(B_i,A_i]$。

这时候的时间复杂度是$\Theta(n^3)$的,不过我们可以用线段树优化$DP$的第二维。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
int n;
int a[300000],b[300000];
pair<int,int> s[300000];
int tr[1000000],lz[1000000];
int ans,cnt,now;
void pushup(int x){tr[x]=max(tr[L(x)],tr[R(x)]);}
void pushdown(int x)
{
if(!lz[x])return;
tr[L(x)]+=lz[x];
tr[R(x)]+=lz[x];
lz[L(x)]+=lz[x];
lz[R(x)]+=lz[x];
lz[x]=0;
}
int ask(int x,int l,int r,int L,int R)
{
if(R<l||r<L)return 0;
if(L<=l&&r<=R)return tr[x];
pushdown(x);
int mid=(l+r)>>1;
return max(ask(L(x),l,mid,L,R),ask(R(x),mid+1,r,L,R));
}
void add(int x,int l,int r,int k,int w)
{
if(l==r)
{
tr[x]=max(tr[x],w);
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(k<=mid)add(L(x),l,mid,k,w);
else add(R(x),mid+1,r,k,w);
pushup(x);
}
void change(int x,int l,int r,int L,int R)
{
if(R<l||r<L)return;
if(L<=l&&r<=R)
{
tr[x]++;
lz[x]++;
return;
}
pushdown(x);
int mid=(l+r)>>1;
change(L(x),l,mid,L,R);
change(R(x),mid+1,r,L,R);
pushup(x);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
s[++cnt]=make_pair(a[i],cnt);
s[++cnt]=make_pair(b[i],cnt);
}
sort(s+1,s+cnt+1);
s[0].first=-1;
for(int i=1;i<=cnt;i++)
{
if(s[i].first!=s[i-1].first)now++;
if(s[i].second&1)a[(s[i].second+1)>>1]=now;
else b[s[i].second>>1]=now;
}
for(int i=1;i<=n;i++)
{
int maxn=((b[i]^now)?ask(1,1,now,b[i]+1,now):0)+1;
ans=max(ans,maxn);
if(a[i]<=b[i]+1)add(1,1,now,a[i],maxn);
else
{
maxn=ask(1,1,now,a[i],now)+1;
add(1,1,now,a[i],maxn);
change(1,1,now,b[i]+1,a[i]-1);
}
}
printf("%d",ans);
return 0;
}

rp++

[CSP-S模拟测试]:队长快跑(DP+离散化+线段树)的更多相关文章

  1. HZOI20190908模拟40 队长快跑,影魔,抛硬币 题解

    题面:https://www.cnblogs.com/Juve/articles/11487699.html 队长快跑: 权值线段树与dp yy的不错 #include<iostream> ...

  2. csp-s模拟测试55(9.29)联「线段树」·赛「??」题「神仙DP」

    T1 联 考试两个小时终于调过了,话说一个傻逼错最后还是静态查出错的..... 大概维护两个懒标记,一个区间覆盖,一个区间异或,然后保证每个区间只会存在一种懒标记. 然后维护区间0的个数,查询时查询那 ...

  3. [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)

    题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...

  4. [CSP-S模拟测试]:platform(后缀数组+二分+线段树)

    题目传送门 题目描述 走过奈何桥有一个名叫望乡台的土台,望乡台有个名曰孟婆的老妇人在卖孟婆汤.一生爱恨情仇,一世浮沉得失,都可以随这碗孟婆汤遗忘得干干净净.现在有$n$碗孟婆汤摆成一排,汤的品种不超过 ...

  5. NOIP模拟14「队长快跑·影魔·抛硬币」

    T1:队长快跑 基本思路:   离散化·DP·数据结构优化DP   这三个我都没想到....气死.   定义状态数组:\(c[i][j]\)表示在i时最小的a值是j时可以摧毁的最多的水晶数.   那么 ...

  6. BZOJ4829: [Hnoi2017]队长快跑

    BZOJ4829: [Hnoi2017]队长快跑 Description 众所周知,在P国外不远处盘踞着巨龙大Y. 传说中,在远古时代,巨龙大Y将P国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个P国的 ...

  7. [LOJ 2022]「AHOI / HNOI2017」队长快跑

    [LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...

  8. 干物妹小埋 (离散化 + 线段树 + DP)

    链接:https://ac.nowcoder.com/acm/contest/992/B来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深刻 ...

  9. NOIP 模拟 $14\; \text{队长快跑}$

    题解 \(by\;zj\varphi\) 一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少 看到数据范围,直接想离散化 设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁 ...

随机推荐

  1. angualr项目引入容联 七陌7mroo

    最近项目要求在注册页面增加客服服务浮窗,各种查找资料准备采用7moor来实现.现记录一下实现过程,便于后期查看: 引入7moor浮窗有两种方式: 1.h5方式,这种情况一般是单独打开新页面即可: 直接 ...

  2. Win7系统取消登录界面的两种方法(图文)

    windows7系统设置电脑密码后,即使取消密码,也会出现登录界面 ,每次都要点击用户图标才能进入系统,这样比较麻烦.那么有什么办法可以取消登录界面呢?方法当然是有的,阅读下文教程,我们一起来看下Wi ...

  3. 前端每日实战:103# 视频演示如何用纯 CSS 创作一只监视眼

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/GBzLdy 可交互视频 此视频是可 ...

  4. VS中C语言scanf函数报错

    在VS中创建C项目使用scanf方法时会如下报错 解决方案 方法1:文件中设置 在第一行设置代码    #define _CRT_SECURE_NO_WARNINGS 或者添加警告忽略     #pr ...

  5. 【玩转SpringBoot】异步任务执行与其线程池配置

    同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...

  6. leetcode-解题记录 1108. IP 地址无效化

    题目: 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". ...

  7. HTMLTestRunner优化:带截图、饼图、失败重跑

    github地址:https://github.com/yoyoketang/sele_project_th9

  8. [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being

    [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent c ...

  9. Vue2.0---webpack打包知识点-2

    先贴一篇对vue-cli#2.0进行webpack配置的详细分析: https://zhuanlan.zhihu.com/p/24322005 一.看一下webpack的打包流程 1.package. ...

  10. Java导入

    导入(import)声明用于将任何类型导入编译单元.导入(import)声明出现在包声明之后,第一个类型声明之前. 有两种类型的导入声明: 单类型导入声明 按需导入声明 单类型导入声明 单类型导入声明 ...