首页 > 代码库 > [HDU 4419] Colourful Rectangle (扫描线 矩形面积并)
[HDU 4419] Colourful Rectangle (扫描线 矩形面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419
题目大意:比矩形面积并多了颜色,问染成的每种颜色的面积。
矩形面积并的扫描线维护的是长度,这道题就是维护每个颜色的长度,写起来很蛋疼。
1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 using namespace std; 7 typedef pair<int,int> PII; 8 typedef long long LL; 9 10 struct Node{11 int l,r,h,d,c;12 bool operator<(const Node& a) const{13 return h<a.h;14 }15 Node(int L=0,int R=0,int H=0,int D=0,int C=0):l(L),r(R),h(H),d(D),c(C){}16 };17 const int MAX_N = 100010;18 int T,n;19 Node t[MAX_N<<1];20 int dsum[MAX_N<<2][8],b[MAX_N<<1];21 LL sum[8];22 int scol[MAX_N<<2],len[MAX_N<<2][8];23 24 void push_up(int idx,int l,int r){25 int state = (dsum[idx][1]>0?1:0)|(dsum[idx][2]>0?2:0)|(dsum[idx][4]>0?4:0);26 if( state ) {27 memset(len[idx],0,sizeof(len[idx]));28 len[idx][state] = b[r+1] - b[l];29 for(int i=1;i<8;i++){30 if( state!=(state|i) ){31 int tmp = len[idx<<1][i]+len[idx<<1|1][i];32 len[idx][state|i] += tmp;33 len[idx][state] -= tmp;34 }35 }36 } else if(l!=r){37 for(int i=1;i<8;i++){38 len[idx][i] = len[idx<<1][i] + len[idx<<1|1][i];39 }40 } else {41 memset(len[idx],0,sizeof(len[idx]));42 }43 }44 45 void update(int L,int R,int x,int c,int idx,int l,int r){46 if( L<=l&&R>=r ){47 dsum[idx][c] += x;48 } else {49 int m = l+r>>1;50 if( L<=m ) update(L,R,x,c,idx<<1,l,m);51 if( R>m ) update(L,R,x,c,idx<<1|1,m+1,r);52 }53 push_up(idx,l,r);54 }55 56 int main(){57 scanf("%d",&T);58 int kase = 1;59 while(T--){60 memset(dsum,0,sizeof(dsum));61 memset(len,0,sizeof(len));62 memset(scol,0,sizeof(scol));63 scanf("%d",&n);64 char col[2];65 int x1,y1,x2,y2;66 int ptr = 0 , ptrb = 0;67 for(int i=0;i<n;i++){68 scanf("%s%d%d%d%d",col,&x1,&y1,&x2,&y2);69 int cc;70 if( col[0]==‘R‘ ) cc=1;71 else if( col[0]==‘G‘ ) cc = 2;72 else if( col[0]==‘B‘ ) cc = 4;73 t[ptr++] = Node(x1,x2,y1,1,cc);74 t[ptr++] = Node(x1,x2,y2,-1,cc);75 b[ptrb++] = x1;76 b[ptrb++] = x2;77 }78 sort(t,t+ptr);79 sort(b,b+ptrb);80 int ub = unique(b,b+ptrb) - b;81 memset(sum,0,sizeof(sum));82 83 for(int i=0;i<ptr-1;i++){84 int l = lower_bound(b,b+ub,t[i].l) - b;85 int r = lower_bound(b,b+ub,t[i].r) - b - 1;86 update(l,r,t[i].d,t[i].c,1,0,ub-1);87 if( t[i].h!=t[i+1].h ){88 for(int j=1;j<8;j++){89 sum[j] += (LL)(t[i+1].h-t[i].h)*(LL)(len[1][j]);90 }91 }92 }93 printf("Case %d:\n",kase++);94 printf("%I64d\n%I64d\n%I64d\n%I64d\n%I64d\n%I64d\n%I64d\n",sum[1],sum[2],sum[4],sum[3],sum[5],sum[6],sum[7]);95 }96 return 0;97 }
[HDU 4419] Colourful Rectangle (扫描线 矩形面积并)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。