• HDU4419 Colourful Rectangle



    题意:

      给你n个矩形,每个矩形是R、G、B三种颜色中的一种,三种颜色的混合可以得到7种颜色分别为R, G, B, RG, RB, GB, RGB。求每种颜色的面积。

    线段树,各种不会

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define lson l,mid,rt<<1
     6 #define rson mid,r,rt<<1|1 //注意mid
     7 using namespace std;
     8 const int Ni = 10010;
     9 struct node{
    10     int x1,x2,h,c;
    11     bool operator < (const node &a) const {
    12         return h<a.h;
    13     }
    14 }seg[Ni*2];
    15 int x[Ni*2],tem[8];
    16 int len[Ni*7][8];//记录每种颜色的长度
    17 int col[Ni*7][4];//记录每颜色出现的次数
    18 long long ans[8];
    19 int n,m,ql,qr,cl;
    20 int ot[]={1,2,4,3,5,6,7};
    21 void build()
    22 {
    23     memset(len,0,sizeof(len));
    24     memset(col,0,sizeof(col));
    25     memset(ans,0,sizeof(ans));
    26 }
    27 void update(int l=0,int r=m,int rt=1)
    28 {
    29     if(ql<=x[l]&&x[r]<=qr) cl>0? col[rt][cl]++:col[rt][-cl]--;
    30     else{
    31         int mid=(l+r)>>1;
    32         if(ql<x[mid]) update(lson);
    33         if(qr>x[mid]) update(rson);
    34     }
    35     int i,c=(col[rt][1]>0)|((col[rt][2]>0)<<1)|((col[rt][3]>0)<<2);
    36     for(i=1;i<8;i++) len[rt][i]=0;
    37     len[rt][c]=x[r]-x[l];
    38     for(i=1;i<8;i++) if(i!=c)
    39     {
    40         int tmp=len[rt<<1][i]+len[rt<<1|1][i];
    41         len[rt][i|c]+=tmp;
    42         len[rt][c]-=tmp;
    43     }
    44 }
    45 int main()
    46 {
    47     int T,cs=1,c,i,j;
    48     char str[5];
    49     scanf("%d",&T);
    50     while(T--)
    51     {
    52         scanf("%d",&n);
    53         for(i=0;i<n;i++)
    54         {
    55             scanf("%s%d%d%d%d",str,x+i,&seg[i].h,x+i+n,&seg[i+n].h);
    56             if(str[0]=='R') c=1;
    57             else if(str[0]=='G') c=2;
    58             else c=3;
    59             seg[i].x1=x[i];seg[i].x2=x[i+n];seg[i].c=c;
    60             seg[i+n].x1=x[i];seg[i+n].x2=x[i+n];seg[i+n].c=-c;
    61         }
    62         sort(x,x+n+n);
    63         sort(seg,seg+n+n);
    64         build();n+=n;
    65         for(m=i=0;i<n;i++) if(x[i]!=x[m]) x[++m]=x[i];
    66         for(n--,i=0;i<n;i++)
    67         {
    68             ql=seg[i].x1;qr=seg[i].x2;cl=seg[i].c;
    69             update();
    70             for(j=1;j<8;j++)
    71                 ans[j]+=(long long)(seg[i+1].h-seg[i].h)*len[1][j];
    72         }
    73         printf("Case %d:\n",cs++);
    74         for(i=0;i<7;i++)
    75             printf("%I64d\n",ans[ot[i]]);
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    CMD命令
    存储过程-使用(二)
    存储过程-基本(一)
    事务学习-概念(一)
    组装简历必备的9大要件
    Java 正则表达式详解_正则表达式
    各类程序员学习路线图
    mrql初级教程-使用(er)
    PHP获取当期前运行文件的路径,名字,服务器路径
    mysqldump导入导出mysql数据库
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2701484.html
Copyright © 2020-2023  润新知