我:
/*
第一行L和N表示的是校园原来有L+1棵树, 并接下来有N次砍树或者种树的操作 。0表示砍树 1 表示种树
以下N行表示砍树和种树的标记和范围。每行3个整数。
L(1<=L<=10000) 和N (1<=N<=100)
输出格式共2行,第一行校门外留下的树苗数量 ,第二行种上又被拔掉的树苗数目。
*/
int ar[10005] = { 0 };//-1表示初始值(树) 0 被砍掉(空) 1表示种上(树苗) 10 种树上又被砍的
int L, N;
cin >>L >> N;
for (int i = 0; i < L; i++)
{
ar[i] = -1;//初始化原始的值
}
for (int i = 0; i < N; i++)
{
int flag, start, end;
cin >> flag >> start >> end;
if (flag == 0) {//砍树
for (int j = start; j <= end; j++)
{
if (ar[j] == 1) {//表示种树又被拔掉的数目
ar[j] = 10;
}
else {
ar[j] = 0;
}
}
}
else {//种树
for (int k = start; k < end; k++)
{
if (ar[k] == 0||ar[k]==10) {//只有被砍掉的才要种
ar[k] = 1;
}
}
}
}
int smCount=0,kdSmCount=0;
for (int i = 0; i < L; i++)
{
if (ar[i] == 1) {
smCount++;
}
else if (ar[i] == 10) {
kdSmCount++;
}
}
cout << smCount <<endl << kdSmCount<<endl;
大佬:
bool opt;
int L, N;
int n1, n2; // 种树/砍树 的起点和终点
int ans1 = 0, ans2 = 0; // 最后幸存树苗 种上又被砍掉的树苗
int flag[10005] = {0};
// 1 --> 当前点是大树
// 2 --> 当前点是树苗
// 0 --> 当前点树被砍掉
cin >> L >> N;
for(int i = 0; i <= L; i++) {
flag[i] = 1; // 起始时,每个点都有一颗大树
}
for(int i = 1; i <= N; i++) {
cin >> opt >> n1 >> n2;
if(opt == 0) {
// 砍树
for(int j = n1; j <= n2; j++) {
if(flag[j] == 2) {
ans2++; // 统计当前被砍掉的树苗
}
flag[j] = 0;
}
} else {
// 种树
for(int j = n1; j <= n2; j++) {
if(flag[j] == 0) {
flag[j] = 2; // 种上树苗
}
}
}
}
for(int i = 0; i <= L; i++) {
if(flag[i] == 2) {
ans1++;
}
}
cout << ans1 << "\n" << ans2 << endl;