汕头市队赛 SRM 09 A 撕书

A 撕书I-3 SRM 09

背景&&描述

    琉璃在撕书。
    书总共有n页,都悬浮在数轴上,第i页的位置为p_{i},上面写着一个数字a_{i}
    琉璃从右往左撕书。假如看到了第i页,就把在第i页左边,且与之距离<=a_{i}的书都撕掉。(第i页本身不撕)
    夜子为了尽量地保全魔法书,决定偷偷在琉璃开始撕之前,增加一页。增加的这一页必须在所有书页的右边,数字随意。
    夜子想知道,最少会有多少页书被撕毁。

 

输入格式

第一行一个整数n,表示书页数。

接下来n行,第i行的俩整数分别为p_{i}a_{i}

输出格式

一个整数,表示最少被撕毁的书页数。

样例输入
4
1 9
3 1
6 1
7 4
样例输出
1
数据范围与约定
  • 对于100%的数据:1\leq n\leq 10^6,0\leq p_{i}\leq10^6 ,1\leq a_{i}\leq10^6,保证不同页的位置不同。
来源

cf原题

 

错在位置等于0时树状数组没有特判掉QAQ 最后坐标全部+1就是答案了

————————————————————————————————————————

这道题很容易想到那个可以多加一页就是可以消去最后的某一段以实现答案的最优

所以我们只需要考虑每个点 如果他要保留 那么他要撕掉多少页 记录一答案就行辣

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=1e6+7;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
    return ans*f;
}
int ans,n,sum[M],s[M],mx;
struct node{int x,c;}e[M];
bool cmp(node a,node b){return a.x<b.x;}
int lowbit(int x){return x&-x;}
int query(int x){
    int sum=0;
    while(x>0){sum+=s[x]; x-=lowbit(x);}
    return sum;
}
void insert(int x){
    while(x<=mx){
        s[x]++;
        x+=lowbit(x);
    }
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++) e[i].x=read()+1,e[i].c=read(),mx=max(mx,e[i].x);
    sort(e+1,e+1+n,cmp);
    for(int i=1;i<=n;i++){
        int k=query(e[i].x-e[i].c-1);
        sum[i]=sum[k]+1;
        ans=max(sum[i],ans);
        insert(e[i].x);
    }
    printf("%d\n",n-ans);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7282566.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值