题目传送门(内部题89)


输入格式

第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间。
接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标。


输出格式

输出一个答案表示$R$最多能得到多少只猎物。


样例

样例输入:

4 5
-1 1
2 4
5 9
6 8

样例输出:

3


数据范围与提示

对于$30\%$的数据:$n\leqslant 20,\max(|l|,|r|)\leqslant 100$。
对于$60\%$的数据:$n\leqslant 5,000,\max(|l|,|r|)\leqslant 5,000$。
对于$100\%$的数据:$n\leqslant 100,000,\max(|l|,|r|)\leqslant 500,000$。


题解

注意两次开枪之间的间隔只需要在$k$之上就好了,不需要一定是$k$。

状态转移很好写,在此不再赘述,用线段树优化即可满分。

但是需要注意的是,如果一直鸟的长度$>k$,那么就会被计数两次,若和避免这样的情况呢?

用一个数组记录当前点的鸟有多少,再在这只鸟飞走的时候再将其插入线段树,而当前点的答案就是线段树里能覆盖这个点的鸟$+$维护的那个数组的当前点的值。

因为在鸟飞走后再将其插入,所以就避免了重复计算。

注意边界问题,即$l,r<0$的情况;具体实现可以参考代码。

时间复杂度:$\Theta(n\log \max(|l|,|r|))$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
struct rec{int l,r;}pos[100001];
int n,k;
int s[500002],beg[500002],mx;
int tr[2000010],lz[2000010];
int ans;
bool cmp(rec a,rec b){return a.r==b.r?a.l<b.l:a.r<b.r;}
void pushup(int x){tr[x]=max(tr[L(x)],tr[R(x)]);}
void pushdown(int x){tr[L(x)]+=lz[x];lz[L(x)]+=lz[x];tr[R(x)]+=lz[x];lz[R(x)]+=lz[x];lz[x]=0;}
void add(int x,int l,int r,int k,int w)
{
if(l==r){tr[x]=w;return;}
int mid=(l+r)>>1;
pushdown(x);
if(k<=mid)add(L(x),l,mid,k,w);
else add(R(x),mid+1,r,k,w);
pushup(x);
}
void add(int x,int l,int r,int L,int R,int w)
{
if(r<L||R<l)return;
if(L<=l&&r<=R){tr[x]+=w;lz[x]+=w;return;}
int mid=(l+r)>>1;
pushdown(x);
add(L(x),l,mid,L,R,w);
add(R(x),mid+1,r,L,R,w);
pushup(x);
}
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];
int mid=(l+r)>>1;
pushdown(x);
return max(ask(L(x),l,mid,L,R),ask(R(x),mid+1,r,L,R));
}
int main()
{
scanf("%d%d",&n,&k);
int top=0;
for(int i=1;i<=n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
l=max(l,0);if(r<0)continue;
l++;r++;s[l]++;s[r+1]--;
pos[++top]=(rec){l,r};
beg[l]++;mx=max(mx,r+1);
}
n=top;sort(pos+1,pos+n+1,cmp);
for(int i=1;i<=mx;i++)s[i]+=s[i-1];
int fail=1,now=0;
for(int i=1;i<=mx;i++)
{
int flag=s[i]+ask(1,1,mx,max(0,i-(k<<1)),max(0,i-k));
now+=beg[i];ans=max(ans,flag);
add(1,1,mx,i,flag-now);
while(fail<=n&&pos[fail].r==i)
{
now--;
add(1,1,mx,pos[fail].l,pos[fail].r,1);
fail++;
}
}
printf("%d",ans);
return 0;
}

rp++

[CSP-S模拟测试]:bird(线段树优化DP)的更多相关文章

  1. 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分

    LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...

  2. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  3. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  4. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  5. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  6. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  7. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  8. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  9. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  10. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

随机推荐

  1. 在 IntelliJ IDEA 中使用 Git,太方便了!

    git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也 因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可以提交代码,切 ...

  2. 3-app应用操作——Models.py和字段类型

    Models.py定义 每一个数据表对应一个model定义,model之间和java一样可以相互之间继承.所有的model都必须继承 from django.db import models#或间接继 ...

  3. 均值滤波器(平滑空间滤波器)基本原理及Python实现

    1. 基本原理 使用元素的领域内像素的平均值代替该元素,可明显的降低图像灰度的尖锐变换.它的一种重要应用是模糊处理:得到感兴趣的区域的粗略表示,将次要的/小的元素与背景融合,使得主要的/较大的元素变得 ...

  4. python中常见的一些错误异常类型

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的 ...

  5. 优化 Karatsuba 乘法(老物)

    虽然写好了我自己用的a*启发函数但还是有些不尽人意,如果通过数学分析确定不出问题可以工作了的话应该就会发出来了 // Karatsuba 递归式距离推导 // h(x) = f(x) * g(x):/ ...

  6. Scala学习笔记(3)

    数组 ----------------------------------- 0.若长度固定则用Array,若长度可能变化则使用ArrayBuffer 1.提供初始值的时候不要使用new. 2.用() ...

  7. 十三、LaTex中的参考文献BibTex

    将默认文献工具设置为bibtex

  8. Microsoft Azure Overview

    Day1 Overview 1. Cloud - Internet scaling / Internet connects / Resource pool 2. Why the cloud?  Rap ...

  9. Python深入:编码问题总结

    转自:http://blog.csdn.net/gqtcgq/article/details/47068817 一:字符编码简介          1:ASCII          最初的计算机的使用 ...

  10. php正则表达式修饰符详解

    preg_match_all("/(.+)<\/form>/isU" , $string, $result); 这里/ 后面加了 3个修饰符 i 是 不区分大小写的匹配 ...