校门外的树(增强版)
题目描述
校门外马路上本来从编号 000 到 LLL,每一编号的位置都有一棵树。有砍树者每次从编号 AAA 到 BBB 处连续砍掉每一棵树,就连树苗也不放过(记 0 A B
,含 AAA 和 BBB);幸运的是还有植树者每次从编号 CCC 到 DDD 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记 1 C D
,含 CCC 和 DDD);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵?
输入格式
第一行,两个正整数 LLL 和 NNN,表示校园外原来有 L+1L + 1L+1 棵树,并有 NNN 次砍树或种树的操作。
以下 NNN 行,每行三个整数,表示砍树或植树的标记和范围。
输出格式
共两行。第一行校门外留下的树苗数目,第二行种上又被拔掉的树苗数目。
样例 #1
样例输入 #1
10 3
0 2 6
1 1 8
0 5 7
样例输出 #1
3
2
提示
对于 100%100 \%100% 的数据,1≤L≤100001 \le L \le 100001≤L≤10000,1≤N≤1001 \le N \le 1001≤N≤100。
C++实现
#include
//#include
#include <bits/stdc++.h>
using namespace std;
int a[10001],ans1,ans2;
int main()
{
int L,n;
cin>>L>>n;
memset(a,1,sizeof(a));
for(int i=1;i<=n;i++){
int k,t1,t2;
scanf("%d%d%d",&k,&t1,&t2);
if(k==0){
for(int j=t1;j<=t2;j++){
if(a[j]==2)
ans1++;
a[j]=0;
}
}else{
for(int j=t1;j<=t2;j++){
if(a[j]==0)
a[j]=2;
}
}
}
for(int i=0;i<=L;i++){
if(a[i]==2)
ans2++;
}
cout<<ans2<<endl<<ans1;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容