問題の説明
シシエヴァー島にはn個の畑が点在しています。各フィールドは、平面直交座標系の下で左下隅の座標 (x1, y1) と右上隅の座標 (x2, y2) によって一意に決まり、x1 を満たす長方形の領域とみなすことができます。 <x2、y1<y2。n 個のフィールドのうち、任意の 2 つのフィールドの交差面積は 0 であり、境界のみが重なる可能性があります。
最近、Dundun は南山の麓にある面積 a×b の長方形のフィールドを開拓したいと考えています。左下隅の座標は (0,0)、右上隅の座標は (a, b)。ダンダンの選択したエリアにすでに存在するフィールドの面積を計算してみます。
入力フォーマット
標準入力からデータを読み取ります。
合計 n+1 行を入力します。
入力の最初の行には、スペースで区切られた 3 つの正の整数 n、a、b が含まれており、それぞれシシーバー島のフィールド プロットの数とダンドンの選択したエリアの右上隅の座標を示します。
次の n 行には、それぞれスペースで区切られた 4 つの整数 x1、y1、x2、および y2 が含まれており、フィールドの位置を表します。
出力フォーマット
標準出力に出力します。
ダンダンの選択領域内のフィールド領域を表す整数を出力します。
サンプル入力
4 10 10
0 0 5 5
5 -2 15 3
8 8 15 15
-2 10 3 15
データ
サンプル出力
44
データ
サンプル説明
図のように、選択したエリアのフィールド(緑色のエリア)の面積は 44 です。
サブタスク
すべてのテスト データは n ≤ 100 を満たし、すべての入力座標の絶対値が 104 を超えません。
問題解決のアイデア:
要は行列の交差面積を求め、描いて観察することで法則を見つけ出すことです。交差部分の面積(2つの長方形を例にします)、交差部分行列の右境界は元の2つの大きな行列の右境界の小さい方の値、左境界は大きい値です元の 2 つの大きな行列の左境界の。したがって、交差行列の幅は、右境界から左境界を引いたもの x = min(a, x2) - max(0, x1) となり、同様に、上境界と下境界の関係 y = min( b, y2) - max(0, y1); 最後に、x と y が 0 より大きいかどうかを判断することで 2 つの行列の間に交差があるかどうかを判断し、そうであれば、sum += x * y;
C++ のフルスコア コードは次のとおりです。
#include <iostream>
名前空間 std を使用します。
int main()
{ int n, a, b; int x1、y1、x2、y2; int x, y; int 合計 = 0; cin >> n >> a >> b; for(int i = 1; i <= n; i++){ cin >> x1 >> y1 >> x2 >> y2; x = 最小(a, x2) - 最大(0, x1); y = 最小(b, y2) - 最大(0, y1); if(x >= 0 && y >= 0) 合計 += x * y; } cout << 合計; 0を返します。}
要約する
CCF CSP 認定試験の最初の質問として、コードの量は一般にそれほど長くなく、for ループは通常 1 層しかないため、ルールを遵守して要約し、抽象モデルを洗練することに注意してください。この問題では条件判断にif文を多用する生徒もおり、時間がかかりミスしやすく正答率が低く、結果として第1問の精神が崩壊し、結果に影響を及ぼします。行き詰まり、時間内に戦術を切り替えないように注意してください。