zoukankan      html  css  js  c++  java
  • Vijos1056 图形面积

    描述

    桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

    格式

    输入格式

    输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–10^8到10^8之间的整数。

    输出格式

    输出只有一行,一个整数,表示图形的面积。

    样例1

    样例输入1[复制]

    3
    1 1 4 3
    2 -1 3 2
    4 0 5 2

    样例输出1[复制]

    10

    来源

    某校NOIP模拟题

    将所有的横线和竖线离散化排序,用它们将原矩形切分成一个个不重叠的小矩形,然后累计面积。

    模拟赛的时候虽然想出了正解,但是x[]和y[]数组没有开long long,中途相乘的时候爆掉了(第二次犯错,上一次是海底高铁),只有60分

    然而比赛的时候是windows评测,需要I64d,我开的是lld,如果真的开了long long,估计会爆零

    ……

    hah……

     1 /*By SilverN*/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 #define LL long long
     8 using namespace std;
     9 const int mxn=320;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 struct node{
    17     int x1,x2,y1,y2;
    18 }a[mxn];
    19 int n;
    20 LL ans=0;
    21 LL x[mxn],y[mxn];
    22 bool use[mxn][mxn];
    23 void init(){
    24     for(int i=1;i<=n;i++){
    25         a[i].x1=read();a[i].y1=read();a[i].x2=read();a[i].y2=read();
    26         x[i*2-1]=a[i].x1;
    27         y[i*2-1]=a[i].y1;
    28         x[i*2]=a[i].x2;
    29         y[i*2]=a[i].y2;
    30     }
    31     sort(x+1,x+n*2+1);
    32     sort(y+1,y+n*2+1);
    33     return;
    34 }
    35 int main(){
    36     n=read();
    37     init();
    38     int i,j,k;
    39     int lim=n*2;
    40     for(i=1;i<=n;i++){
    41         for(j=1;j<lim;j++){//枚举横坐标 
    42             if(x[j]>a[i].x2)break;
    43             if(a[i].x1<=x[j] && x[j+1]<=a[i].x2)
    44                 for(k=1;k<lim;k++){//枚举纵坐标 
    45                     if(y[k]>a[i].y2)break;
    46                     if(a[i].y1<=y[k] && y[k+1]<=a[i].y2)
    47                         use[j][k]=1;
    48                 }
    49         }
    50     }
    51     for(j=1;j<lim;j++)
    52      for(k=1;k<lim;k++){
    53          if(use[j][k]){
    54              ans+=(x[j+1]-x[j])*(y[k+1]-y[k]);
    55          }
    56      }
    57     printf("%lld
    ",ans);
    58     return 0;
    59 }
  • 相关阅读:
    子查询
    主键、外键
    语句、聚合函数、数学函数、字符串函数、时间日期函数
    数据库的备份、还原、分离、附加
    SQL server数据类型、增删改查
    轮播特效
    手风琴特效
    关于Winform中的用户代理
    详细的SQL中datediff用法
    sql server 的datediff函数
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6035335.html
Copyright © 2011-2022 走看看