luoguP1047

题解 P1047 【校门外的树】


思路分析

创建一个数组,长度为l

先把每一个位置都设为有树(即1)

然后在输入每一个区域的起止点后,从起点遍历数组至终

点,砍掉所经过的树(即设为零)

(不能减一是因为一个树不能砍两遍重复时也不会多减)

然后将数组内的数求和并输出


代码部分

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define gt getchar
#define pt putchar
using namespace std;
inline ll read(){
    ll x=0,f=1;char ch=gt();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=gt();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gt();}
    return x*f;}
inline void print(ll x){if(x<0)pt('-'),x=-x;if(x>9)print(x/10);pt(x%10+48);}
int all[200005];
int main(){
	int l = read(), m = read();
	l+=1;
	
	for(int i = 0; i < l; ++i){//初始化all数组使每一个数都为1 
		all[i]=1;
	}
	for(int i = 0; i < m; ++i){//输入区域并砍倒树
		int u = read(), v = read()//输入区域 
		for(; u <= v; ++u){//砍树
			all[u] = 0;
		}
	}
	int sum = 0;
	for(int a = 0; a < l; ++a){
		sum += all[a];//数树
	}
	cout << sum;//输出 
	return 0;
}

仅为大家提供思路

posted @ 2023-01-08 12:18  Qinzh  阅读(43)  评论(2)    收藏  举报