设为首页 加入收藏

TOP

hdu-4419-Colourful Rectangle-线段树求面积并
2015-07-24 06:28:47 来源: 作者: 【 】 浏览:35
Tags:hdu-4419-Colourful Rectangle- 线段 面积

这道题目很有意思,写的麻烦了,估计得写很长时间。

幸好,我一开始就想出来了比较简单的方法。。。

利用位运算,把颜色RGB分别用1,2,4,表示。

那么就可以根据当前区间的状态来求当前区间每一种状态的长度了。

#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         #include
        
          #include
          #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define maxn 11000 #define mem(a,b) (memset(a),b,sizeof(a)) #define lmin 1 #define rmax len #define lson l,(l+r)/2,rt<<1 #define rson (l+r)/2+1,r,rt<<1|1 #define root lmin,rmax,1 #define now l,r,rt #define int_now int l,int r,int rt #define INF 99999999 #define LL __int64 #define mod 10007 #define eps 1e-6 #define zero(x) (fabs(x)
          
           mp; int du[maxn*2]; int len; struct list { int x; int y,yy; int cl; int leap; friend bool operator <(const list &a,const list &b) { return a.x
           
            r||rr
            
             =r) { yan[rt][cl]+=x; push_up(now); return; } updata(ll,rr,cl,x,lson); updata(ll,rr,cl,x,rson); push_up(now); } int main() { int T,cas; scanf("%d",&T); cas=0; int n,x,y,xx,yy; char str[1110]; while(T--) { cas++; scanf("%d",&n); int cl; int ls=0; du[0]=-1; for(int i=1;i<=n;i++) { scanf("%s%d%d%d%d",str,&x,&y,&xx,&yy); if(str[0]=='R')cl=0; if(str[0]=='G')cl=1; if(str[0]=='B')cl=2; node[i*2-1].cl=cl; node[i*2-1].y=y ; node[i*2-1].leap=1; node[i*2-1].x=x; node[i*2-1].yy=yy; node[i*2 ].cl=cl; node[i*2 ].y=y ; node[i*2 ].leap=-1; node[i*2 ].x=xx; node[i*2 ].yy=yy; du[++ls]=y; du[++ls]=yy; } sort(node+1,node+n*2+1); sort(du,du+ls+1); len=0; for(int i=1;i<=ls;i++) { if(du[i]!=du[i-1]) { mp[du[i]]=++len; du[len]=du[i]; } } len--; LL are[8]; int st; st=0; creat(); memset(are,0,sizeof(are)); for(int i=1;i<=n*2;i++) { int l=mp[node[i].y]; int r=mp[node[i].yy]; for(int j=1;j<=7;j++) { are[j]+=(LL)color[1][j]*(node[i].x-st); } st=node[i].x; updata(l,r-1,node[i].cl,node[i].leap,root); } printf("Case %d:\n",cas); printf("%I64d\n",are[1]); printf("%I64d\n",are[2]); printf("%I64d\n",are[4]); printf("%I64d\n",are[3]); printf("%I64d\n",are[5]); printf("%I64d\n",are[6]); printf("%I64d\n",are[7]); } } 
            
           
          
        
       
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SDYT OJ-2891玲珑龟 下一篇POJ 3083 - Children of the Cand..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: