数论 矩阵交集

参考网址 https://www.cnblogs.com/yzm10/p/10963692.html

 输入

2
2
0 0 1 1
1 1 2 2
3
0 0 2 6
1 1 4 4
1 3 3 9
输出
0 0
0 0
2 6
2 5
2 5

求矩阵的交集个数和交集面积
画出两个矩阵的交集即可,在草稿纸上画出,找出横纵坐标的大小关系,进行比较
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Node{
    int x1,y1,x2,y2;
}a[5005];

int calc(int a1x1,int a1y1,int a1x2,int a1y2,int a2x1,int a2y1,int a2x2,int a2y2){
    int c=0;
    ll m1=max(min(a1x1,a1x2),min(a2x1,a2x2));
    ll n1=max(min(a1y1,a1y2),min(a2y1,a2y2));
    ll m2=min(max(a1x1,a1x2),max(a2x1,a2x2));
    ll n2=min(max(a1y1,a1y2),max(a2y1,a2y2));
    if(m2>m1&&n2>n1) return 1;
    return 0;
}
ll cals(int a1x1,int a1y1,int a1x2,int a1y2,int a2x1,int a2y1,int a2x2,int a2y2){
    int c=0;
    ll m1=max(min(a1x1,a1x2),min(a2x1,a2x2));
    ll n1=max(min(a1y1,a1y2),min(a2y1,a2y2));
    ll m2=min(max(a1x1,a1x2),max(a2x1,a2x2));
    ll n2=min(max(a1y1,a1y2),max(a2y1,a2y2));
    if(m2>m1&&n2>n1) return (m2-m1)*(n2-n1);
    return 0;
}
int main()
{
    int t,n,i,j;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
        }
        for(i=1;i<=n;i++){
            int c=0;
            ll s=0;
            for(j=1;j<=n;j++){
                if(i==j) continue;
                c+=calc(a[i].x1,a[i].y1,a[i].x2,a[i].y2,a[j].x1,a[j].y1,a[j].x2,a[j].y2);
                s+=cals(a[i].x1,a[i].y1,a[i].x2,a[i].y2,a[j].x1,a[j].y1,a[j].x2,a[j].y2);
            }
            printf("%d %lld\n",c,s);
        }
    }
    return 0;
}

 

posted @ 2020-05-02 18:03  someonezero  阅读(919)  评论(0编辑  收藏  举报