洛谷P1047 [NOIP2005 普及组] 校门外的树 题解

前言

如何把一道入门题写成省选题?(手动滑稽)

本题解是我在练习分块时突发奇想写的,真就把入门题写成省选题的感觉(

才发现原来这些简单题这么有趣(


文章目录

  • 前言
  • P1047 [NOIP2005 普及组] 校门外的树 题解
    • 一、模拟解法(正常解法)
    • 二、线段树解法(开始奇怪起来)
    • 三、分块解法 (开始毒瘤起来)
    • 四、珂朵莉树解法 (非常珂学)
  • 总结
  • 题外话


P1047 [NOIP2005 普及组] 校门外的树 题解

题目链接: P1047 [NOIP2005 普及组] 校门外的树

题意:马路上砍树,问砍了 m m m 次还有几棵树

一、模拟解法(正常解法)

我们只要把每次砍掉的树标记一下,最后统计未标记的数量即可

注意下标从 0 0 0 开始,共 n + 1 n+1 n+1 个数

代码如下:

#include 
using namespace std;
#define int long long
#define R register
#define MAXN (int)(1e4+5)
int n,m,ans;
bool a[MAXN];
signed main()
{
   
	scanf("%lld%lld",&n,&m);
	for(R int i=1,l,r; i<=m; i++)
	{
   
		scanf("%lld%lld",&l,&r);
		for(R int j=l; j<=r; j++)
			a[j]=1;
	}
	for(R int i=0; i<=n; i++)ans+=(a[i]==0);
	printf("%lld\n",ans);
	return 0;
}

二、线段树解法(开始奇怪起来)

直接用线段树维护区间,没什么特别的

代码如下:

#include 
using namespace std;
#define int long long
#define R register
#define MAXN (int)(1e4+5)
template<typename T>inline void read(R T &k)
{
   
	R char ch=getchar(); R T x=0,f=1;
	while(!isdigit(ch)){
   if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){
   x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	k=x*f;
}
int n,m,a[MAXN],ans[MAXN<<2],tag[MAXN<<2];
inline int ls(R int x){
   return x<<1;}
inline int rs(R int x){
   <

你可能感兴趣的:(OI,算法,数据结构)