Luogu _P1276校門の外の木(拡張バージョン)(Shang Xian)

タイトルポータル

まず最初に、エラーにつながるいくつかの無視しやすいピットについて触れておきます
1。

学校の門の外にいくつの苗木が残っていますか?

最初から見ずに、校舎の樹数をそのまま出力しましたか? 20点の良いスコア)、おそらく私は誤解された唯一の人です

2。

樹木プランターは何本の苗木を植えていますか?

間違っている可能性のある人は少なく、つまり、木のカッターが苗木を切るたびに、彼はans ++ではなくans ++を切るということです。

3。

校門の外の道路は、もともと0からLまでの番号が付けられており、番号が付けられた各位置に木があります。

間違った番号を読んだのは私だけではありません(自分を慰めようとしています)

最後に述べたように、質問は慎重に検討する必要があります。そうしないと、完全に正しいプログラムも爆発します(これらの穴を見つけるために1ページの提出記録をLuo Guに提供したことは伝えません)

次に
、質問をする前にデータのサイズを確認する良い習慣につけます

この質問のデータは L 1 < = L < = 10000 そして N 1 < = N < = 100 L(1 <= L <= 10000)とN(1 <= N <= 100)
ねえ、O(n ^ 2)のシミュレーションは***を通過できるようです。

さあ、シミュレーションを書いてください(シミュレーションを書くことができる場合は、ラインセグメントツリーを書かないでください。ラインセグメントツリーのコードサイズは補完できません)。

#include<bits/stdc++.h>
#define ll long long//随手long long好习惯

using namespace std;

const ll FFF=10000+5;

ll l,n;
bool opt;//判断是砍树还是种树
ll a,b;
ll flag[FFF];//flag=1时是树(就是一开始就存在的),flag=2时是树苗(就是后来种下的)
			 //flag=0时是空气(空坑)
ll ans_1,ans_2;//ans_1记录最终校门外留下的树苗棵数,ans_2记录植树者种上又被砍掉的树苗棵数

int main()
{
	freopen("cpp.in", "r", stdin);
	freopen("cpp.out", "w", stdout);
    ios::sync_with_stdio(false);//关闭流同步,让cin、cout变得和scanf、printf一样快
    cin>>l>>n;
    for(int i=0;i<=l;++i)//记住编号从0开始,到l结束
    {
        flag[i]=1;//初始化,把树都种上
    }
    for(int i=0;i<n;++i)
    {
        cin>>opt>>a>>b;
        if(opt==0)//如果是砍树
        {
            for(int j=a;j<=b;++j)//那就砍呗,从a到b
            {
                if(flag[j]==2)//如果砍的是树苗
                {
                    ans_2+=1;//ans_2++
                }
                flag[j]=0;//让flag=0,即记为空坑
            }
        }
        else//如果是种树
        {
            for(int j=a;j<=b;++j)
            {
                if(flag[j]==0)//如果遇到一个空坑
                {
                    flag[j]=2;//就把树苗种上,把flag变为2(注意,是树苗了,不能把flag变成1)
                }
            }
        }
    }
    for(int i=0;i<=l;++i)//最后处理
    {
        if(flag[i]==2)//如果校门口有树苗的话
        {
            ans_1+=1;//ans_1++
        }
    }
    cout<<ans_1<<endl<<ans_2;//输出,完结撒花
    return 0;
}

私のACコード

#include <iostream>
#include <cstdio>
#define SIZE 100 + 10
#define SIZE2 (int)1e4 + 10
using namespace std;
int tree[SIZE2];

void print(const int *, const int &);

int main() {
	freopen("cpp.in", "r", stdin);
	freopen("cpp.out", "w", stdout);
	int n, L, ans2 = 0, ans = 0;
	scanf("%d%d", &L, &n);
	for (int i = 1; i <= n; ++i) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		if (x == 0) {
			for (int i = y; i <= z; ++i) {
				if (tree[i] == 2) {
					++ans2;
				}
				tree[i] = 1;
			}
		} else {
			for (int i = y; i <= z; ++i) {
				if (tree[i] == 1) {
					tree[i] = 2;
				}
			}
		}
	}
	for (int i = 0; i <= L; ++i) {
		if (tree[i] == 2) {
			++ans;
		}
	}
	printf("%d\n%d\n", ans, ans2);
	return 0;
}
公開された33元の記事 ウォンの賞賛0 ビュー167

おすすめ

転載: blog.csdn.net/weixin_42790071/article/details/105565515