题解:(又是水题的一天 ,
该题的关键就是对矩形区域的覆盖式纪录
最简单的思路就是给矩形区域一遍又一遍的全部替换(特水的题,不想花太多精力
for(int i = a;i <= a+c;i ++){
for(int j = b;j <= b+d;j ++){
vec[i][j] = flag ;
}
}
cout << vec[i][j] << endl ;//即可
如此反复的进行赋值操作(10的5次方*10的5次方*10的4次方,你不爆时间才怪呢!!
所以我们要换一种储存矩形区域的方式,而实际上我们只要储存对角的坐标即可 (通过下面的不等式关系,我们可以轻而易举的判断所符合的矩形区域有哪些
接下来是如何储存a,b,c,d四个变量,你可以用n行4列的二维数组存储,也可以用长度为4*n的一维数组存储;
二维数组AC代码:
#include<bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
const int mod = 1e9 + 7;
vector<vector<int>>vecv ;
int main(){
//freopen("in.txt", "r", stdin);
//freopen("test.txt", "w", stdout);
vector<int>vec ;vec.push_back(0) ;
vecv.push_back(vec) ;vec.clear() ;//将行下标为零的数组置零,不需要
int n ;cin >> n ;
for(int i = 0;i < n;i ++){
int a,b,c,d ;cin >> a >> b >> c >> d ;
vec.push_back(a),vec.push_back(b),vec.push_back(c+a),vec.push_back(d+b) ;//直接存储两个坐标
vecv.push_back(vec) ;
vec.clear() ;
}
int x,y,ac=-1 ;cin >> x >> y ;
for(int i = n;i >= 1;i --){
if(vecv[i][0]<=x&&vecv[i][1]<=y&&vecv[i][2]>=x&&vecv[i][3]>=y){ ac = i ;break ;}
}
cout << ac << endl ;
// for(int i = 1;i <= n;i ++){
// for(int j = 0;j < 4;j ++){
// cout << vecv[i][j] << " " ;
// }
// cout << endl ;
// }
return 0;
}
一维数组AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n;
while(cin >> n){
vector<long long>vin;
while(n--){
int a,b,c,d;
cin >> a >> b >> c >> d ;
vin.push_back(a);
vin.push_back(b);
vin.push_back(a+c);
vin.push_back(b+d);
}
long long x,y,sum=0;
cin >> x >> y ;
int flag=0;
long long num=vin.size();
for(long long i=0;i<num;i=i+4){
flag++;
if(x>=vin[i]&&y>=vin[i+1]&&x<=vin[i+2]&&y<=vin[i+3]) sum=flag;// 将4个数看为一组,每次加4
}
if(sum==0) cout << -1 << endl ;
else cout << sum << endl ;
}
return 0;
}
(一天水一题,欧耶