原题链接(洛谷):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;
}
参与PK投票
下次再发洛谷
选问
没有回复内容