洛谷P1276 校门外的树(增强版)-编程题目及题解论坛-编程-擎雷博客

洛谷P1276 校门外的树(增强版)

原题链接(洛谷):https://www.luogu.com.cn/problem/P1276

原题markdown:

# 校门外的树(增强版)

## 题目描述

校门外马路上本来从编号 $0$ 到 $L$,每一编号的位置都有一棵树。有砍树者每次从编号 $A$ 到 $B$ 处连续砍掉每一棵树,就连树苗也不放过(记 `0 A B`,含 $A$ 和 $B$);幸运的是还有植树者每次从编号 $C$ 到 $D$ 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记 `1 C D`,含 $C$ 和 $D$);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵?

## 输入格式

第一行,两个正整数 $L$ 和 $N$,表示校园外原来有 $L + 1$ 棵树,并有 $N$ 次砍树或种树的操作。

以下 $N$ 行,每行三个整数,表示砍树或植树的标记和范围。

## 输出格式

共两行。第一行校门外留下的树苗数目,第二行种上又被拔掉的树苗数目。

## 样例 #1

### 样例输入 #1

```
10 3
0 2 6
1 1 8
0 5 7
```

### 样例输出 #1

```
3
2
```

## 提示

对于 $100 \%$ 的数据,$1 \le L \le 10000$,$1 \le N \le 100$。

题解:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;   
int a, b, c, l, n, ans[20000]={0}, ans1=0, ans2=0;
int main()
{
	cin >> l >> n;
	for(int i = 1;i <= n; i ++){
		cin >> a >> b >> c;
		if(a == 1)
		{
			for(int j = b; j <= c; j ++)
			    if(ans[j] == 1)
				   ans[j] = 2;
		}
		else if(a == 0)
		{
			for(int j = b; j <= c; j ++)
			{
				if(ans[j] == 2)ans1 ++;
				ans[j] = 1;
			}
		}
	}
	for(int i = 0;i <= l; i ++)
	    if(ans[i] == 2)
	       ans2 ++;
	cout << ans2 << endl << ans1;
	return 0;
}
请登录后发表评论

    没有回复内容