【模拟7.29】辣鸡

根据内存,本以为是道数学题,或是数据结构题。

当然不是,其实正解真的超好想,就是一堆if判断.....

我们发现成立的情况要么是矩形内部,要么是矩形之间

显而易见矩形内部就是(长-1)*(宽-1)*2

矩形之间分情况(先按x1排序 y1次之)

case 1:(在角上)

那么最多只有1的贡献

if(e[j].x1==e[i].x2+1&&(e[i].y2+1==e[j].y1||e[i].y1-1==e[j].y2))
{
        ans++;
} 

case 2:在上下(以上为例)

因为我们已经按x分好

所以此时我们只要考虑2种情况

一种是上面的长度大于下面的,一种小于。

case 3:在左右

反正我是分了四种情况,还有各种++操作,有点麻烦......

大体上就是想加上(两个矩形重复相邻的-1)在加上两个矩形重复相邻部分的上边缘,下边缘,判断一下即可

算了还是看代码吧

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<string>
  7 #include<vector>
  8 #include<map>
  9 #define int long long 
 10 #define MAXN 110010
 11 using namespace std;
 12 int n;
 13 struct node{int x1;int y1;int x2;int y2;}e[MAXN];
 14 bool cmp(node a,node b)
 15 {
 16      return (a.x1==b.x1)?(a.y1<b.y1):(a.x1<b.x1);
 17 }
 18 int ans=0;
 19 void work1(int x,int y)
 20 {
 21      if(e[y].y1>=e[x].y2+1)return ;
 22      if(e[y].y2<=e[x].y1-1)return ;
 23      int a=e[x].x2,b=e[y].x1;
 24      int c=e[x].y2,d=e[x].y1,ee=e[y].y2,f=e[y].y1;
 25      if(c>=ee&&d<=f)
 26      {
 27          ans+=2*(ee-f);
 28          if(c>=ee+1)
 29          {
 30                ans+=1;
 31          }
 32          if(d<=f-1)
 33          {
 34                ans+=1;
 35          }
 36      }
 37      else if(c<=ee&&d>=f)
 38      {
 39          ans+=2*(c-d);
 40          if(ee>=c+1)
 41          {
 42                ans+=1;
 43          }
 44          if(f<=d-1)
 45          {
 46                ans+=1;
 47          }
 48      }
 49      else if(f<=c&&c<=ee)
 50      {
 51          ans+=2*(c-f);
 52          if(ee>=c+1)
 53          {
 54                ans++;
 55          }
 56          if(d<=f-1)
 57          {
 58                ans++;
 59          }
 60      }
 61      else if(d<=ee&&d>=f)
 62      {
 63          ans+=2*(ee-d);
 64          if(f<=d-1)
 65          {
 66              ans++;
 67          }
 68          if(ee<=c-1)
 69          {
 70              ans++;
 71          }
 72      }
 73      return ;
 74 }
 75 void work2(int x,int y)
 76 {
 77    if(e[x].x2<=e[y].x1-1)return ;
 78    if(e[x].x1>=e[y].x2+1)return ;
 79    if(e[y].x2>=e[x].x2)
 80    {
 81        ans+=2*(e[x].x2-e[y].x1);
 82        int a=e[x].x1,b=e[x].x2,c=e[y].x1,d=e[y].x2;
 83        if(a<=c-1)ans++;
 84        if(b<=d-1)ans++;   
 85       // printf("work2: ans=%lld\n",ans);
 86    }
 87    else
 88    {
 89        ans+=2*(e[y].x2-e[y].x1);
 90        int a=e[x].x1,b=e[x].x2,c=e[y].x1,d=e[y].x2;
 91        if(a<=c-1)ans++;
 92        if(b>=d+1)ans++;
 93    }
 94    
 95 }
 96 signed main()
 97 {
 98     scanf("%lld",&n);
 99     for(int i=1;i<=n;++i)
100     {     
101         scanf("%lld%lld%lld%lld",&e[i].x1,&e[i].y1,&e[i].x2,&e[i].y2);
102     }
103     sort(e+1,e+n+1,cmp);
104     for(int i=1;i<=n;++i)
105     {
106          for(int j=i+1;j<=n;++j)
107          {
108             //  printf("i=%lld x1=%lld y1=%lld x2=%lld y2=%lld\nj=%lld x1=%lld y1=%lld x2=%lld y2=%lld\n",i,e[i].x1,e[i].y1,e[i].x2,e[i].y2,j,e[j].x1,e[j].y1,e[j].x2,e[j].y2);
109               if(e[j].x1>e[i].x2+1)
110               {
111                   break;
112               }       
113               //printf("%lld %lld\n",e[i].y2+1,e[i].y1);
114               if(e[j].x1==e[i].x2+1&&(e[i].y2+1==e[j].y1||e[i].y1-1==e[j].y2))
115               {
116                   //printf("work3:\n");
117                    ans++;
118               } 
119               else if(e[j].x1==e[i].x2+1)
120               {
121                  //  printf("work1:\n");
122                    work1(i,j);
123               }
124               else if(e[j].y1==e[i].y2+1||e[j].y2+1==e[i].y1)
125               {
126                //    printf("work2:\n");
127                    work2(i,j);
128               }
129               //printf("ans=%lld\n",ans);
130          }
131          if(e[i].y2-e[i].y1==0||e[i].x2-e[i].x1==0)continue;
132          ans+=(e[i].y2-e[i].y1)*(e[i].x2-e[i].x1)*2;
133          //printf("---------ans=%lld\n",ans);
134     }
135     printf("%lld\n",ans);
136 }
View Code

 

posted @ 2019-07-29 17:32  Wwb_star  阅读(139)  评论(1编辑  收藏  举报