zoukankan      html  css  js  c++  java
  • hdu 3642 体积并

    题意:求三个矩形体积的并

    链接:点我

    枚举z

      1 #include<stdio.h>
      2 #include<iostream>
      3 #include<stdlib.h>
      4 #include<string.h>
      5 #include<algorithm>
      6 #include<vector>
      7 #include<math.h>
      8 #include<map>
      9 #pragma comment(linker, "/STACK:1024000000,1024000000")
     10 using namespace std;
     11 #define maxn 1100
     12 #define mem(a,b) (memset(a),b,sizeof(a))
     13 #define lmin 1
     14 #define rmax len
     15 #define lson l,(l+r)/2,rt<<1
     16 #define rson (l+r)/2+1,r,rt<<1|1
     17 #define root lmin,rmax,1
     18 #define now l,r,rt
     19 #define int_now int l,int r,int rt
     20 #define INF 99999999
     21 #define LL long long
     22 #define mod 10007
     23 #define eps 1e-6
     24 #define zero(x) (fabs(x)<eps?0:x)
     25 #define LL __int64
     26 map<int,int>mp;
     27 int du[maxn*2];
     28 struct lines
     29 {
     30     int x;
     31     int y,yy;
     32     int z,zz;
     33     int leap;
     34     friend bool operator <(const lines &a,const lines &b)
     35     {
     36         return a.x<b.x;
     37     }
     38 } line[maxn*2];
     39 int num[maxn*4*2];
     40 int sum[maxn*4*2];
     41 int kum[maxn*4*2];
     42 int cover[maxn*4*2];
     43 void push_down(int_now)
     44 {
     45 
     46 }
     47 void push_up(int_now)
     48 {
     49     int len=du[r+1]-du[l];
     50     if(cover[rt]==0)
     51     {
     52         num[rt]=num[rt<<1]+num[rt<<1|1];
     53         sum[rt]=sum[rt<<1]+sum[rt<<1|1];
     54         kum[rt]=kum[rt<<1]+kum[rt<<1|1];
     55     }
     56     if(cover[rt]==1)
     57     {
     58         num[rt]=len;
     59         sum[rt]=num[rt<<1]+num[rt<<1|1];
     60         kum[rt]=sum[rt<<1]+sum[rt<<1|1];
     61     }
     62     if(cover[rt]==2)
     63     {
     64         num[rt]=len;
     65         sum[rt]=len;
     66         kum[rt]=num[rt<<1]+num[rt<<1|1];
     67     }
     68     if(cover[rt]>=3)
     69     {
     70         num[rt]=len;
     71         sum[rt]=len;
     72         kum[rt]=len;
     73     }
     74 }
     75 void creat()
     76 {
     77     memset(cover,0,sizeof(cover));
     78     memset(num,0,sizeof(num));
     79     memset(sum,0,sizeof(sum));
     80     memset(kum,0,sizeof(kum));
     81 }
     82 void updata(int ll,int rr,int x,int_now)
     83 {
     84     if(ll>r||rr<l)return;
     85     if(ll<=l&&rr>=r)
     86     {
     87         cover[rt]+=x;
     88         push_up(now);
     89         return;
     90     }
     91     updata(ll,rr,x,lson);
     92     updata(ll,rr,x,rson);
     93     push_up(now);
     94 }
     95 int main()
     96 {
     97     int T,cas;
     98     scanf("%d",&T);
     99     cas=0;
    100     while(T--)
    101     {
    102         cas++;
    103         int n,x,y,z,xx,yy,zz;
    104         mp.clear();
    105         scanf("%d",&n);
    106         LL ls=1;
    107         du[0]=-1000010;
    108         for(int i=1; i<=n; i++)
    109         {
    110             scanf("%d%d%d%d%d%d",&x,&y,&z,&xx,&yy,&zz);
    111             line[i*2-1].x=x;
    112             line[i*2-1].y=y;
    113             line[i*2-1].yy=yy;
    114             line[i*2-1].z=z;
    115             line[i*2-1].zz=zz;
    116             line[i*2-1].leap=1;
    117             line[i*2].x=xx;
    118             line[i*2].y=y;
    119             line[i*2].yy=yy;
    120             line[i*2].z=z;
    121             line[i*2].zz=zz;
    122             line[i*2].leap=-1;
    123             du[ls++]=y;
    124             du[ls++]=yy;
    125         }
    126         sort(line+1,line+n*2+1);
    127         sort(du+1,du+ls);
    128         int len=1;
    129         for(int i=1; i<ls; i++)
    130         {
    131             if(du[i]!=du[i-1])
    132             {
    133                 mp[du[i]]=len;
    134                 du[len++]=du[i];
    135             }
    136         }
    137         len-=2;
    138         LL are=0;
    139         int st=0;
    140         creat();
    141         for(int j=-501; j<501; j++)
    142         {
    143             st=0;
    144             for(int i=1; i<=n*2; i++)
    145             {
    146                 int l,r;
    147                 l=mp[line[i].y];
    148                 r=mp[line[i].yy];
    149                 if(line[i].z>j||line[i].zz<=j)continue;
    150                 LL x,y;
    151                 x=(LL)kum[1];
    152                 y=(LL)line[i].x-st;
    153                 are+=x*y;
    154                 updata(l,r-1,line[i].leap,root);
    155                 st=line[i].x;
    156             }
    157         }
    158         printf("Case %d: %I64d
    ",cas,are);
    159     }
    160     return 0;
    161 }
  • 相关阅读:
    kubernetes使用http rest api访问集群之使用postman工具访问 apiserver
    kubernetes之使用http rest api访问集群
    kubernetes高级之集群中使用sysctls
    kubernetes高级之动态准入控制
    kubernetes高级之pod安全策略
    kubernetes高级之创建只读文件系统以及只读asp.net core容器
    kubernetes之故障现场二,节点名称冲突
    kubernetes故障现场一之Orphaned pod
    kubernetes之故障排查和节点维护(二)
    Python知识点
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4491783.html
Copyright © 2011-2022 走看看