hdu4419Colourful Rectangle

链接

分别求出7种颜色覆盖的面积。

做法:每种颜色设定一个标号,以二进制表示R:100 G:010 B:001 。这样很明显可以知道RG:110 GB:011 以此类推。

求解时,需要开一个二维标记数组,标记了这一段的某种颜色被标记了几次,然后类似状压的方式求解。

 

  1 #include <iostream>

  2 #include<cstdio>

  3 #include<cstring>

  4 #include<algorithm>

  5 #include<stdlib.h>

  6 #include<vector>

  7 #include<cmath>

  8 #include<queue>

  9 #include<set>

 10 #include<map>

 11 using namespace std;

 12 #define N 41010

 13 #define LL __int64

 14 #define INF 0xfffffff

 15 const double eps = 1e-8;

 16 const double pi = acos(-1.0);

 17 const double inf = ~0u>>2;

 18 map<int,int>f;

 19 int s[N<<2][8];

 20 int fs[N<<2],a[N],ff[N<<2][8];

 21 int val[N];

 22 int id[500];

 23 LL num[N];

 24 struct node

 25 {

 26     int x1,x2,y;

 27     int f;

 28     node(){}

 29     node(int x1,int x2,int y,int f):x1(x1),x2(x2),y(y),f(f){}

 30     bool operator <(const node &S)const

 31     {

 32         return y<S.y;

 33     }

 34 }p[N];

 35 void up(int w,int l,int r)

 36 {

 37     int i;

 38     if(fs[w]==0)

 39     {

 40         for(i = 1; i <= 7 ; i++)

 41         {

 42             if(l==r)

 43             s[w][i] = 0;

 44             else

 45             s[w][i] = s[w<<1][i]+s[w<<1|1][i];

 46         }

 47     }

 48     else

 49     {

 50         int res = val[r+1]-val[l];

 51         int cnt[8] = {0};

 52         for(i = 1; i <= 7; i++)

 53         {

 54             if(l==r)

 55             {

 56                 if(i==fs[w])

 57                 cnt[i] += val[r+1]-val[l];

 58                 else

 59                 cnt[i] += 0;

 60             }

 61             else

 62             {

 63                 cnt[i|fs[w]] += s[w<<1][i]+s[w<<1|1][i];

 64             }

 65         }

 66         for(i = 1; i <= 7; i++)

 67         res-=cnt[i];

 68         cnt[fs[w]]+=res;

 69         for(i = 1; i <= 7 ; i++)

 70         s[w][i] = cnt[i];

 71     }

 72 }

 73 void build(int l,int r,int w)

 74 {

 75     int i;

 76     for(i = 1;i<= 7; i++)

 77     {s[w][i] = ff[w][i] = 0;}

 78     fs[w] = 0;

 79     if(l==r)

 80     {

 81         return ;

 82     }

 83     int m = (l+r)>>1;

 84     build(l,m,w<<1);

 85     build(m+1,r,w<<1|1);

 86 }

 87 void update(int a,int b,int d,int l,int r,int w)

 88 {

 89     if(a<=l&&b>=r)

 90     {

 91         ff[w][abs(d)]+=d/abs(d);

 92         if(d>0)

 93         fs[w]|=d;

 94         else if(ff[w][-d]==0) fs[w]+=d;

 95         up(w,l,r);

 96         return ;

 97     }

 98     int m = (l+r)>>1;

 99     if(a<=m) update(a,b,d,l,m,w<<1);

100     if(b>m) update(a,b,d,m+1,r,w<<1|1);

101     up(w,l,r);

102 }

103 int main()

104 {

105     id['R'] = 4;

106     id['G'] = 2;

107     id['B'] = 1;

108     int i,j,t,n,cas = 1;

109     char sr[10];

110     cin>>t;

111     while(t--)

112     {

113         f.clear();

114         scanf("%d",&n);

115         memset(num,0,sizeof(num));

116         int g= 0 ,dd[8];

117         for(i = 1; i <= n; i++)

118         {

119             int x1,x2,y1,y2,k;

120             scanf("%s%d%d%d%d",sr,&x1,&y1,&x2,&y2);

121             if(sr[0]=='R') k = id['R'];

122             else if(sr[0]=='G') k = id['G'];

123             else k = id['B'];

124             p[++g] = node(x1,x2,y1,k);

125             a[g] = x1;

126             p[++g] = node(x1,x2,y2,-k);

127             a[g] = x2;

128         }

129         sort(a+1,a+g+1);

130         sort(p+1,p+g+1);

131         int o = 0;

132         f[a[1]] = ++o;

133         val[o] = a[1];

134         for(i = 2; i <= g ; i++)

135         if(a[i]!=a[i-1])

136         {

137             f[a[i]] = ++o;

138             val[o] = a[i];

139         }

140         build(1,o-1,1);

141 

142         for(i = 1; i < g; i++)

143         {

144             int l = f[p[i].x1];

145             int r = f[p[i].x2]-1;        //cout<<l<<" "<<r<<endl;

146             if(l<=r)

147             {

148                 update(l,r,p[i].f,1,o-1,1);

149             }

150             for(j = 1; j <= 7;  j++)

151             num[j] += (LL)(p[i+1].y-p[i].y)*s[1][j];

152         }

153         dd[1] = 4,dd[2] = 2,dd[3] = 1,dd[4] = 6,dd[5] = 5,dd[6] = 3,dd[7] = 7;

154         printf("Case %d:\n",cas++);

155         for(i = 1; i <= 7; i++)

156         printf("%I64d\n",num[dd[i]]);

157     }

158     return 0;

159 }
View Code

 

你可能感兴趣的:(HDU)