HDU_3255 Farming 扫描线求面积并
来源:互联网 发布:约瑟夫环问题 c语言 编辑:程序博客网 时间:2024/05/02 19:50
http://acm.hdu.edu.cn/showproblem.php?pid=3255
题意:
有N块农田,每块农田中种一种作物,每种作物都有一个价格,当在同一区域内种植了两种不同的作物时,作物价格大的生存下来,生命值小的死亡。求最后的所有作物的能买的总钱数。
思路:
扫描线求体积并,和前面的一个求体积交差不多。 我们可以将作物的价格看作是立体的高,这样就可以直接枚举Z轴求二维矩形面积并了。本题关键是转化,思路很好。
代码:
#include<stdio.h>#include<string.h>#include<algorithm>int N , M ;int h[5] ;const int MAXN = 30010 ;struct point{ int x, y ; void get(){ scanf("%d %d",&x,&y) ; }};struct Node{ point p1 , p2 ; int h;}p[MAXN] ;struct Seg{ int l ,r , h , s ; Seg(){} Seg(int a, int b ,int c, int d) :l(a) , r(b) , h(c) , s(d){} bool operator<(const Seg& cmp) const{ return h < cmp.h ; }}pp[MAXN<<1] ;int x[MAXN<<1] ;int find(int val , int l, int r){ while( l<r ) { int mid = (l + r)>> 1; if( x[mid] < val ) l = mid + 1 ; else r = mid ; } return l ;}int col[MAXN<<3] , sum[MAXN<<3] ;void pushup(int l, int r, int idx){ if( col[idx] ) sum[idx] = x[r+1] - x[l] ; else if( l == r ) sum[idx] = 0 ; else{ sum[idx] = sum[idx<<1] + sum[idx<<1|1] ; }}void update(int l, int r, int idx, int a , int b , int v){ if(l==a && b==r){ col[idx] += v ; pushup(l , r , idx); return ; } int mid = (l + r)>> 1; int ls = idx<<1 , rs = idx<<1|1 ; if( b<=mid ) update(l , mid ,ls , a , b, v); else if( mid<a ) update(mid+1, r, rs ,a ,b , v ); else{ update( l ,mid , ls , a, mid, v ); update( mid+1, r, rs, mid+1, b , v ); } pushup(l ,r, idx);}void solve(){ std::sort(h+1, h+M+1) ; h[0] = 0 ; __int64 res = 0 ; for(int i=1;i<=M;i++){ int hh = h[i] ; int m = 0 ; for(int j=1;j<=N;j++){ if( p[j].h >= hh ){ pp[m] = Seg( p[j].p1.x , p[j].p2.x ,p[j].p1.y , 1 ) ; x[m++] = p[j].p1.x ; pp[m] = Seg( p[j].p1.x , p[j].p2.x ,p[j].p2.y , -1 ); x[m++] = p[j].p2.x ; } } std::sort( x , x+m ); std::sort(pp ,pp+m ); int n = 1 ; for(int j=1;j<m;j++){ if( x[j-1] != x[j] ) x[n++] = x[j] ; } n-- ; memset(col, 0, sizeof(col) ); memset(sum, 0 ,sizeof(sum) ); __int64 ans = 0 ; for(int j=0;j<m-1;j++){ int s = find( pp[j].l, 0 ,n ); int e = find( pp[j].r , 0 , n ) - 1 ; if(s <= e) update(0, MAXN<<1 ,1 , s, e ,pp[j].s ); ans += (__int64)(sum[1])*(__int64)( pp[j+1].h - pp[j].h ); } res += ans*(__int64)( h[i] - h[i-1] ) ; } printf("%I64d\n",res);}int main(){ int ncas , cas ; scanf("%d",&ncas); for(cas=1 ;cas<=ncas ; cas++){ scanf("%d %d",&N, &M ); for(int i=1;i<=M;i++){ scanf("%d",&h[i]); } for(int i=1;i<=N;i++){ p[i].p1.get() ; p[i].p2.get() ; int a ; scanf("%d",&a); p[i].h = h[a] ; } printf("Case %d: ",cas); solve() ; } return 0 ;}
- HDU_3255 Farming 扫描线求面积并
- hdu3255 Farming--线段树 & 扫描线 & 面积并(待解决)
- hdu1542(扫描线求面积并)
- HDU1542 线扫描求矩形面积并
- [裸题][扫描线] 求矩形面积并
- hdu 3255 Farming(扫描线、求立方体交)
- hdu 3255 Farming (线段树扫描线球体积并)
- HDU3255 Farming(线段树+扫描线+体积并)
- 线段树+扫描线求矩阵面积并
- POJ1151(线段树+扫描线求矩形面积并)
- 线段树求矩形面积并 扫描线+离散化
- POJ 1151 Atlantis 求矩阵面积并 扫描线 详解
- hdu1542 线段树扫描线求矩形面积的并
- hdu 1542 扫描线+线段树求矩阵面积并
- HDU 1542 Atlantis (线段树扫描线求面积并)
- 线段树求矩形面积并 扫描线+离散化
- [poj 1151] Atlantis:扫描线+线段树求面积并
- 扫描线+线段树求矩形面积的并
- 编译时选择”重新生成解决方案“,会出现,"已跳过生成: 项目", 不编译, 也不报错,
- xml schema中的命名空间
- Spring execution 表达式
- C++ const引用详解
- 1、shell指令操作【ubuntu】 - 常用shell命令
- HDU_3255 Farming 扫描线求面积并
- mysql 数据库管理中的安全问题(一)
- fatal error C1083: Cannot open include file: 'jpeglib.h ': No such file or
- Codeforces Round #129 (Div. 1) B. Little Elephant and Cards
- Discuz X2版块分区后帖子列表左侧论坛导航只显示本区版块
- 反射
- 绘制表格
- NSGeometry.h 里面的方法详解
- 配置Apache+Tomcat集群