hdu-4419-Colourful Rectangle-段树区,并寻求
2015-08-20 11:29
162 查看
这个问题很有趣的项目,写麻烦。它预计将有写了很长的时间。
好在,我想开了一个比较简单的方法。。
。
使用位计算,颜色RGB分别1,2,4,代表。
状态的长度了。
好在,我想开了一个比较简单的方法。。
。
使用位计算,颜色RGB分别1,2,4,代表。
状态的长度了。
#include<stdio.h> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> #include<vector> #include<math.h> #include<map> #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)<eps?0:x) map<int,int>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<b.x; } }node[maxn*2];; int color[maxn*4*4][8]; int yan[maxn*4*4][3]; void creat() { memset(color,0,sizeof(color)); memset(yan,0,sizeof(yan)); } void push_up(int_now) { int tai=0; for(int i=0;i<=2;i++) if(yan[rt][i])tai=tai|(1<<i); for(int i=0;i<=7;i++)color[rt][i]=0; int all=du[r+1]-du[l]; for(int i=1;i<=7;i++) { color[rt][i|tai]+=color[rt<<1][i]+color[rt<<1|1][i]; } for(int i=1;i<=7;i++)all-=color[rt][i]; color[rt][tai]+=all; } void updata(int ll,int rr,int cl,int x,int_now) { if(ll>r||rr<l)return; if(ll<=l&&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]); } }
相关文章推荐
- Input(Checkbox)全选删除
- hdu 1874 畅通工程续-spfa
- python 文件操作
- mybatis逆向工程,自动生成代码
- Git上传代码
- 论复习
- 异常的例子
- ios Mantle使用小记
- Cannot insert the value NULL into column 'StuID', table 'NETRepository.dbo.S
- [STL系列]STL容器性能比较列表
- appium部分api
- HDU 1058 Humble Numbers
- Activity 跳转 以及4中LunchMode
- @Resource注解
- html中的meta标签作用
- /usr/bin/python^M: bad interpreter: No such file or directory
- Spring MVC 的表单标签
- Linux修改MAC地址
- MySQL 每次查询一条数据查询十次与一次查询十条数据之间的区别
- Spring之 国际化