合計時間制限:1000msのメモリ制限:65536kBの
説明
特別表彰式を調製するためには、会場の矩形領域内の主催者は、長方形のカーペットの一部で覆われた(直交座標系の第一象限と見ることができます)。1からnまでの番号Nカーペットの合計。今連続軸に平行に敷設され、これらの数字カーペット昇順に従って、カーペットを敷設した後、以前に敷設カーペットの上に重ね。カーペットの敷設が完了した後、主催者はポイント数の最上階を覆うカーペットを知りたいです。注:矩形の境界上の点、及びカーペットの4つの頂点がカーペットで覆われて考えることができます。
説明入力出力サンプル1:以下、二重実線で示す破線カーペット番号2で示される実線で示すカーペット1、第3号は、カーペットカーペット3最上層である点(2,2)をカバー。
説明入力出力サンプル2:以下、二重実線で示す破線カーペット番号2で示される実線で示すカーペット1、第3号は、カーペットカーペット3最上層である点(4,5)をカバー。
入力
入力コモン行N + 2。
最初の行、整数n、nは総カーペットを表します。
次の行n iは、それぞれ、カーペットスペースで区切られた2つの整数それぞれ、間に4つの正の整数であり、B、G、Kを含む、カーペット情報を表し、I + 1行数左下隅とカーペットXおよびY軸方向の長さの座標(A、B)。
N + 2番目のラインは、2つの正の整数xとyが含まれ、接地点に必要な表現(x、y)を座標。
データの30%、そこn≤2、
データの50%、0≦A、B、G、k≤100ため 、
データの100%に、そこ0≤n≤10,000,0≤a、B、G、 k≤100,000。
出力
カーペットの数を表す出力コモンライン1、整数、必須;カーペットを出力ここで覆われていない場合は-1。
サンプル入力
サンプル#1:
3
1 3 0 2
0 2 3 3
2 3 3 1
2 2
サンプル#2:
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5。
サンプル出力の
サンプル#1:
3
サンプル#2:
-1
ソースは
再戦セットに最初の質問を改善NOIP2011
分析:
座標を決定する(x、y)は、i番目のカーペット、カーペット上部出力です。
#include<iostream>
using namespace std;
//这几个数组分别表示第i个地毯的左右和上下界限
int wL[10005],wR[10005],hL[10005],hH[10005];
//函数用来判断坐标是否在第n个地毯上
bool inFootcloth(int n,int x,int y){
//如果这个点在地毯的界限内,返回真,否则,返回假
if(x>=wL[n]&&x<=wR[n]&&y>=hL[n]&&y<=hH[n]){
return true;
}else{
return false;
}
}
int main(){
int n;
cin>>n;
//输入并记录第i个地毯的上下左右界限
for(int i=1;i<=n;i++){
int a,b,g,k;
cin>>a>>b>>g>>k;
wL[i]=a;
wR[i]=a+g;
hL[i]=b;
hH[i]=b+k;
}
int x,y;
cin>>x>>y;
//因为是输出最上面的地毯,所以从第n个地毯开始依次往下找,第一个覆盖这个点的地毯即为所求
for(int i=n;i>=1;i--){
if(inFootcloth(i,x,y)){
cout<<i;
return 0;
}
}
cout<<"-1";
return 0;
}