题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入输出格式

输入格式:

输入文件tree.in的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出格式:

输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

输入输出样例

输入样例#1:

500 3

150 300

100 200

470 471

输出样例#1:

298

说明

NOIP2005普及组第二题

对于20%的数据,区域之间没有重合的部分;

对于其它的数据,区域之间有重合的情况。

分析

四种解法,不解释

#include<bits/stdc++.h>  //1层----模拟流
using namespace std;
int n,m,ans;
bool a[11000]; int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*f;
} int main()
{
n=read()+1;m=read();
while(m--)
{
int l=read(),r=read();
for(int i=l;i<=r;++i)
a[i]=1; //表示已被砍
}
for(int i=0;i<=n;++i)
if(a[i]) ++ans; printf("%d\n",n-ans); return 0;
}

这里是分割线


#include<bits/stdc++.h>  //2层----忘了是什么算法来着,反正比模拟高级
using namespace std;
int n,m,ans;
int a[11000],f[11000]; int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*f;
} int main()
{
n=read()+1;m=read(); //代码需要,就+1了,下同
while(m--)
{
int l=read()+1,r=read()+1;
++a[l];--a[r+1];
} for(int i=1;i<=n;++i)
{
f[i]=f[i-1]+a[i];
if(f[i]) ++ans; //被砍过,ans++
} printf("%d\n",n-ans); return 0;
}

这里是分割线


#include<bits/stdc++.h>  //3层----树状数组(比线段树好打一些)
using namespace std;
int n,m,f[11000],ans;
/* 本代码以树状数组区间加,单点查询为模板 */ int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*f;
} int lowbit(int x)
{
return x&(-x);
} void update(int i,int x)
{
for(;i<=n;i+=lowbit(i))
f[i]+=x;
} bool query(int i)
{
int res=0;
for(;i;i-=lowbit(i))
if(f[i]) res+=f[i];
return res;
} int main()
{
n=read()+1;m=read(); //注意题目中的树范围是0~n,
//树状数组的操作是从1开始的,所以n++
while(m--)
{
int l=read()+1,r=read()+1; //同上+1
update(l,1);
update(r+1,-1);
} for(int i=1;i<=n;++i)
if(query(i)) ++ans; //被砍过,ans++ printf("%d\n",n-ans); return 0;
}

这里是分割线


#include<bits/stdc++.h>  //4层----线段树
using namespace std;
int n,m,sum[41000]; //姑且写个读入优化吧,虽说其实用不着
int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*f;
} void buildtree(int k,int l,int r)
{
if(l==r){ sum[k]=1; return ;}
if(l>r) return ;
int mid=l+r>>1;
buildtree(k*2,l,mid);
buildtree(k*2+1,mid+1,r);
sum[k]=sum[k*2]+sum[k*2+1];
} void update(int k,int l,int r,int L,int R)
{
if(l>R || r<L || !sum[k]) return ; //不包含直接退
if(L<=l && r<=R) //全包含sum改0
{
sum[k]=0;
return ;
} int mid=l+r>>1;
update(k*2,l,mid,L,R);
update(k*2+1,mid+1,r,L,R);
sum[k]=sum[k*2]+sum[k*2+1]; //更新sum[father];
} int main()
{
n=read();m=read();
buildtree(1,0,n);
while(m--)
{
int l,r;
l=read();r=read();
update(1,0,n,l,r);
} printf("%d\n",sum[1]);
return 0;
}
                                                            --all by Mr Zhang

ok,四种解法发完。

(你会几种?_ (:зゝ∠) _)

测试平台

落谷P1047

四重解法---P1047 校门外的树的更多相关文章

  1. P1047 校门外的树

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  2. 洛谷P1047 校门外的树

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  3. 洛谷——P1047 校门外的树

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  4. luogu P1047 校门外的树 x

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  5. 【洛谷】【线段树】P1047 校门外的树

    [题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...

  6. [模拟]P1047 校门外的树

    校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,- ...

  7. 洛谷 P1047 校门外的树(待完善)

    链接:https://www.luogu.org/problemnew/show/P1047 题目: 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是11米.我们可以把马路看 ...

  8. 洛谷题解P1047 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,…,L,都种有 ...

  9. [线段树]P1047 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...

随机推荐

  1. synchronized 和lock的区别

    synchronized 是什么时候释放? 1.获取锁的线程执行完代码2.线程执行出现异常 synchronized 的缺陷? 1.Lock类可以主动释放锁.2.synchronized 是被动. R ...

  2. HDU - 5073 Galaxy(数学)

    题目 题意:n个点,运行移动k个点到任何位置,允许多个点在同一位置上.求移动k个点后,所有点到整体中心的距离的平方和最小. 分析:这题题目真的有点迷...一开始看不懂.得知最后是选取一个中心,于是看出 ...

  3. springBoot整合mybatis、jsp 或 HTML

    springBoot整合mybatis.jsp Spring Boot的主要优点: 1:  为所有Spring开发者更快的入门: 2:  开箱即用,提供各种默认配置来简化项目配置: 3:  内嵌式容器 ...

  4. HTTP Method小记

    HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这3个方法 HTTP 1.1 这个版本是当前版本,包含GET HEAD POST OPTIONS PUT ...

  5. jsp登录注册

    只帖源代码,,,,不讲解. 1.Login.jsp <%@ page language="java" import="java.util.*" pageE ...

  6. C#调用C++导出类的一个实例

    一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了.https://blog.csdn.net/huiyouyongdeyu2011/article/d ...

  7. 在Linux上安装Git

    Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.而国外的GitHub和国内的Coding都是项目的托管平台.但是在使用Git工具的时候,第一步要学会如何安装gi ...

  8. luogu 2704 炮兵阵地 状压dp

    状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...

  9. mac 下node,yarn安装及版本切换

    node安装 https://nodejs.org/en/download/ 到官网下载指定版本 安装node的管理工具 sudo npm install -g n //安装n sudo n 8.9. ...

  10. 【JS】获取一个月份有多少天

    new Date(year, month, 0).getDate() 通过 Date 构造函数传入年份.月份.零,然后通过调用获取日期函数即可获取当前月份有多少天 new Date(2019, 2, ...