HDU 3642 Get The Treasury
来源:互联网 发布:企业网络宣传语 编辑:程序博客网 时间:2024/06/06 17:04
//g++ AC 在两个int型变量进行乘法时,为了防止溢出,请使用(LL)强制类型转换//HDU 请使用__int64/* 注意到z这一维的坐标范围较小,可以考虑直接离散化z的坐标之后进行枚举,对x,y平面内进行普通的线段树矩形求交即可. 另外,在计算覆盖三次的面积的时候,sum1代表只覆盖一次的线段长度,sum2代表只覆盖两次的线段长度,sum3代表只覆盖了三次以及以上的线段长度. 这样在pushup()函数书写方便 */#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;#define LL long longconst int maxn = 2222;struct edge{ int a,b,h; int s;};struct cube{ int x1,y1,z1,x2,y2,z2;};cube c[maxn];edge e[maxn];bool cmp(const edge &p,const edge &q){ if(p.h==q.h) return p.s<q.s; return p.h<q.h;}int x[maxn];int z[maxn];int lazy[maxn<<2];int sum1[maxn<<2];int sum2[maxn<<2];int sum3[maxn<<2];int n,m,p;int kase;void pushup(int l,int r,int rt){ int lc=rt<<1; int rc=rt<<1|1; if(lazy[rt]<=-3) { sum3[rt]=x[r+1]-x[l]; sum2[rt]=sum1[rt]=0; }else if(lazy[rt]==-2) { sum3[rt]=sum3[lc]+sum3[rc]+sum2[lc]+sum2[rc]+sum1[lc]+sum1[rc]; sum2[rt]=x[r+1]-x[l]-sum3[rt]; sum1[rt]=0; }else if(lazy[rt]==-1) { sum3[rt]=sum2[lc]+sum2[rc]+sum3[lc]+sum3[rc]; sum2[rt]=sum1[lc]+sum1[rc]; sum1[rt]=x[r+1]-x[l]-sum2[rt]-sum3[rt]; }else if(l==r) { sum3[rt]=sum2[rt]=sum1[rt]=0; }else { sum3[rt]=sum3[lc]+sum3[rc]; sum2[rt]=sum2[lc]+sum2[rc]; sum1[rt]=sum1[lc]+sum1[rc]; }}void update(int L,int R,int s,int l,int r,int rt){ if(L<=l&&r<=R) { lazy[rt]+=s; pushup(l,r,rt); return; } int mid=(l+r)>>1; if(L<=mid) update(L,R,s,l,mid,rt<<1); if(R>mid) update(L,R,s,mid+1,r,rt<<1|1); pushup(l,r,rt);}int bst(int v,int x[],int size){ int mid; int l,r; l=0,r=size-1; while(l<=r) { mid=(l+r)>>1; if(x[mid]==v) return mid; if(x[mid]<v) l=mid+1; else r=mid-1; } return -1;}void input(){ scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d%d%d%d%d",&c[i].x1,&c[i].y1,&c[i].z1,&c[i].x2,&c[i].y2,&c[i].z2); } //printf("%d\n",n);}void add_rectangel(int x1,int y1,int x2,int y2){ x[m]=x1; e[m].a=x1,e[m].b=x2,e[m].h=y1,e[m++].s=-1; x[m]=x2; e[m].a=x1,e[m].b=x2,e[m].h=y2,e[m++].s=1;}void solve(){ if(n<3) { printf("Case %d: 0\n",kase++); return; } LL ans=0; int cnt; for(int i=0;i<n;i++) { z[2*i]=c[i].z1; z[2*i+1]=c[i].z2; } sort(z,z+2*n); for(int i=0;i+1<2*n;i++) { memset(lazy,0,sizeof(lazy)); memset(sum1,0,sizeof(sum1)); memset(sum2,0,sizeof(sum2)); memset(sum3,0,sizeof(sum3)); m=0; LL res=0; for(int j=0;j<n;j++) { if(c[j].z1<=z[i]&&z[i]<c[j].z2) { add_rectangel(c[j].x1,c[j].y1,c[j].x2,c[j].y2); } } cnt=1; for(int i=1;i<m;i++) { if(x[i]!=x[i-1]) x[cnt++]=x[i]; } sort(e,e+m,cmp); sort(x,x+cnt); int L,R; for(int i=0;i+1<m;i++) { L=bst(e[i].a,x,cnt); R=bst(e[i].b,x,cnt)-1; if(L<=R) { update(L,R,e[i].s,0,cnt-1,1); res+=(LL)sum3[1]*(e[i+1].h-e[i].h); } } res*=z[i+1]-z[i]; ans+=res; } printf("Case %d: %lld\n",kase++,ans);}int main(){ int T; scanf("%d",&T); //printf("%d\n",T); kase=1; while(T--) { input(); solve(); } return 0;}
0 0
- hdu 3642 Get The Treasury
- HDU 3642 Get The Treasury
- HDU-3642-Get The Treasury
- HDU 3642 Get The Treasury
- hdu 3642 Get The Treasury(扫描线)
- hdu 3642 Get The Treasury(线段树求体积并)
- hdu 3642 Get The Treasury (三维的扫描线)
- hdu-3642--Get The Treasury-线段树求面积并
- hdu 3642 Get The Treasury(扫描线、立方体交)
- HDU 3642 Get The Treasury(线段树)
- Hdu 3642 Get The Treasury(长方体的体积交)
- HDU 3642 Get The Treasury 【线段树】【扫描线】
- HDU 3642 Get The Treasury(体积并,离散化)
- hdu3642 Get The Treasury
- HDU 3642 Get The Treasury (线段树、扫描线求立方体体积交)
- hdu 3642 Get The Treasury 扫描线求长方体体积交
- HDU 3642 Get The Treasury(离散化+线段树:扫描线)
- Get The Treasury - HDU 3642 扫描线 重复三次的体积
- hdu1285 确定比赛名次(拓扑排序多种方法)
- Swift_10_网络请求
- 归并排序算法
- 编写systemd下服务脚本
- Linux下的输入/输出重定向
- HDU 3642 Get The Treasury
- hdu3314(Trouble with Election!)— 并查集
- pomelo+mongo搭建笔记
- Android自动化测试(Jenkins+Robotium+Ant+Junit)[PART one]
- IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码
- HDU - 1874 - 畅通工程续(最短路,Floyd,图论基础题)
- iOS反射机制: objc_property_t的使用
- 【html】【一个滚动的图片的代码】
- CentOS 5下配置Catcti监控MySQL