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;
}
仅为大家提供思路

浙公网安备 33010602011771号