线段树 体积并——hdu3255
来源:互联网 发布:linux安装教程 编辑:程序博客网 时间:2024/04/28 07:09
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL __int64 using std::sort; const int nsize=33333; struct Matrix { int x1,x2,y1,y2,s; }matrix[nsize]; struct Line { int x1,x2,y,f; Line () {} Line (int a,int b,int c,int d) : x1(a),x2(b),y(c),f(d){} bool operator < (const Line &cmp) const { return y<cmp.y; } }line[nsize<<1]; LL ans; int p[5],q[5]; int X[nsize<<1]; int cov[nsize<<2]; int len[nsize<<2]; void PushUp(int rt,int l,int r) { if (cov[rt]) len[rt]=X[r+1]-X[l]; else if (l==r) len[rt]=0; else len[rt]=len[rt<<1]+len[rt<<1|1]; } void update(int rt,int l,int r,int L,int R,int v) { if (L<=l&&r<=R) { cov[rt]+=v; PushUp(rt,l,r); return ; } int m=(l+r)>>1; if (L<=m) update(rt<<1,l,m,L,R,v); if (R>m) update(rt<<1|1,m+1,r,L,R,v); PushUp(rt,l,r); } int Fin(int key,int k) { int l=1,r=k; while (l<=r) { int m=(l+r)>>1; if (X[m]==key) return m; else if (X[m]<key) l=m+1; else r=m-1; } return -1; } int main() { int T,n,m,i,j,k,nx,ny,cas=0; scanf("%d",&T); while (T--) { scanf("%d %d",&n,&m); for (i=1;i<=m;i++) { scanf("%d",&p[i]); q[i]=p[i]; } q[0]=0; sort(q+1,q+m+1); for (i=1;i<=n;i++) { scanf("%d %d %d %d %d",&matrix[i].x1,&matrix[i].y1, &matrix[i].x2,&matrix[i].y2,&matrix[i].s); } for (ans=0,i=1;i<=m;i++) { for (nx=ny=0,j=1;j<=n;j++) { k=matrix[j].s; if (p[k]>=q[i]) { X[++nx]=matrix[j].x1; X[++nx]=matrix[j].x2; line[++ny]=Line(matrix[j].x1,matrix[j].x2,matrix[j].y1,1); line[++ny]=Line(matrix[j].x1,matrix[j].x2,matrix[j].y2,-1); } } memset(cov,0,sizeof(cov)); memset(len,0,sizeof(len)); sort(X+1,X+nx+1); sort(line+1,line+ny+1); for (k=1,j=2;j<=nx;j++) if (X[j]!=X[j-1]) X[++k]=X[j]; for (j=1;j<ny;j++) { int l=Fin(line[j].x1,k); int r=Fin(line[j].x2,k)-1; update(1,1,k,l,r,line[j].f); ans+=1LL*len[1]*(q[i]-q[i-1])*(line[j+1].y-line[j].y); } } printf("Case %d: %I64d\n",++cas,ans); } return 0; }
0 0
- 线段树 体积并——hdu3255
- hdu3255 线段树体积并
- 线段树体积并hdu3255
- HDU3255 Farming(线段树+扫描线+体积并)
- hdu3255 线段树扫描线求体积
- HDU3255[farm] (扫描线方体体积并)
- 线段树 hdu3255 Farming
- HDU3255(线段树+扫描线)
- hdu3255 Farming--线段树 & 扫描线 & 面积并(待解决)
- HDU3255 Farming(线段树+扫描线)
- hdu 3642 Get The Treasury(线段树求体积并)
- POJ 3642 长方体体积并 线段树 扫描线
- [线段树] hdu 3255 Farming#求体积并
- hdu 3255 Farming(线段树求长方体体积并)
- 线段树扫描线(体积并)hdu3642
- HDU 3255 Farming(线段树求体积并)
- hdu 3255 Farming(线段树求体积并)
- hdu3642-Get The Treasury 线段树+扫描线+离散化 求三维体积并
- 一个用JS实现的简单的汉诺塔
- 浅析android应用增量升级
- oracle索引
- 【USACO1.2_1】★Milking Cows 挤牛奶
- minSdkVersion、targetSdkVersion、targetApiLevel的区别
- 线段树 体积并——hdu3255
- Python 3 tkinter 相关组件名称变化
- XDR-从文件空间解码整数
- 经典算法--堆排
- JSP隐含对象收藏
- C++堆内存和栈内存详解
- poj1817
- 2011斯坦福大学iOS应用开发教程学习笔记(第三课)Objective-C
- switch case break