手贱把i打成j,调了半天

  1. /*
  2. 面积并转体积并,长方体高度为作物价格
  3. 算体积并:在笛卡尔坐标系的y轴上建立线段树cnt记录区间被完全覆盖的次数,sum记录区间被覆盖的总长度
  4. 以平行于xoy的平面从下往上扫描,把穿过扫描面的长方体的上下边加入集合segs,对集合segs里的边排序,然后一根扫描线从下往上扫描
  5. 另外,更新是不影响线段边界的
  6. */
  7. #include<iostream>
  8. #include<cstring>
  9. #include<cstdio>
  10. #include<algorithm>
  11. #include<map>
  12. #define ll long long
  13. #define maxn 30000*2+10
  14. #define lson l,m,rt<<1
  15. #define rson m,r,rt<<1|1
  16. using namespace std;
  17. struct Seg{
  18. int l,r,h,c;
  19. Seg(){}
  20. Seg(int a,int b,int c,int d):l(a),r(b),h(c),c(d){}
  21. bool operator<(const Seg & a)const{
  22. return h<a.h;
  23. }
  24. }segs[maxn];
  25. struct cube{
  26. int x1,y1,z1,x2,y2,z2;
  27. cube(){}
  28. cube(int a,int b,int c,int d,int e,int f):x1(a),y1(b),z1(c),x2(d),y2(e),z2(f){}
  29. }cubes[maxn];
  30. int seeds[],n,m;
  31. int y[maxn<<],toty,tot;
  32. int z[maxn],totz;
  33. map<int,int>mp;
  34. ll cnt[maxn<<],len[maxn<<];
  35. void init(){
  36. tot=toty=totz=;
  37. mp.clear();
  38. memset(cnt,,sizeof cnt);
  39. memset(len,,sizeof len);
  40. }
  41.  
  42. inline void pushup(int rt,int l,int r){
  43. if(cnt[rt]){
  44. len[rt]=y[r]-y[l];
  45. }
  46. else if(l+==r) len[rt]=;
  47. else len[rt]=len[rt<<]+len[rt<<|];
  48. }
  49. void update(int L,int R,int c,int l,int r,int rt){
  50. if(L<=l && R>=r){
  51. cnt[rt]+=c;
  52. pushup(rt,l,r);
  53. return;
  54. }
  55. int m=l+r>>;
  56. if(L<m) update(L,R,c,lson);
  57. if(R>m) update(L,R,c,rson);
  58. pushup(rt,l,r);
  59. }
  60. int main(){
  61. int T,a,b,c,d,e;
  62. cin >> T;
  63. for(int tt=;tt<=T;tt++){
  64. init();
  65. cin >> n >> m;
  66. for(int i=;i<=m;i++)scanf("%d",&seeds[i]);
  67. z[tot++]=;//把地平线加上!
  68. for(int i=;i<=n;i++){
  69. scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
  70. cubes[i]=cube(a,b,,c,d,seeds[e]);
  71. z[totz++]=seeds[e];
  72. y[toty++]=b;y[toty++]=d;
  73. }
  74. z[totz++]=;
  75. sort(z,z+totz);totz=unique(z,z+totz)-z;//离散化z轴
  76. sort(y,y+toty);toty=unique(y,y+toty)-y;//离散化x轴
  77. for(int i=;i<toty;i++) mp[y[i]]=i;
  78.  
  79. ll res=;
  80. for(int i=;i<totz-;i++){
  81. tot=;//初始化
  82. memset(segs,,sizeof segs);
  83. /* memset(cnt,0,sizeof cnt);
  84. memset(len,0,sizeof len); */
  85.  
  86. for(int j=;j<=n;j++){//遍历所有cubes,把符合条件的加进去
  87. if(cubes[j].z1<=z[i] && cubes[j].z2>=z[i+]){
  88. segs[tot++]=Seg(cubes[j].y1,cubes[j].y2,cubes[j].x1,);
  89. segs[tot++]=Seg(cubes[j].y1,cubes[j].y2,cubes[j].x2,-);
  90. }
  91. }
  92. sort(segs,segs+tot);
  93. for(int j=;j<tot;j++){
  94. if(j!=)
  95. res+=(ll)(z[i+]-z[i])*(segs[j].h-segs[j-].h)*len[];
  96. update(mp[segs[j].l],mp[segs[j].r],segs[j].c,,toty-,);
  97.  
  98. }
  99. }
  100. printf("Case %d: %lld\n",tt,res);
  101. }
  102. return ;
  103. }

hdu3255扫描线:带权面积交转体积交的更多相关文章

  1. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...

  2. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  3. Java数据结构——带权图

    带权图的最小生成树--Prim算法和Kruskal算法 带权图的最短路径算法--Dijkstra算法 package graph; // path.java // demonstrates short ...

  4. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  5. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  6. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  7. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  8. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

  9. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...

随机推荐

  1. sed命令使用介绍(转载)

    sed命令介绍 (转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html) 简介 sed 是一种在线编辑器,它一次处理一 ...

  2. Java 搜索引擎

    1.Java 全文搜索引擎框架 Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Luc ...

  3. svg标签

    在页面上画图无非有两种方法,一种是canvas,另外一种就是svg了,canvas之前已经介绍过了,现在来介绍一下svg吧. 其实早在svg出现以前几年,微软已经推出了类似的东西,叫做vml,早期是为 ...

  4. xen 基础命令学习

    # 查看创建的虚拟机的uuid xe vm-list # 开启虚拟机启动顺序功能 xe vm-param-set HVM-boot-policy="BIOS order" uuid ...

  5. ECharts图表引用json数据

    来讲两个图表,一个折线图,一个饼图. 先来看看效果图: 现在来看看代码,先来折线图,后台: (这里的后台太麻烦了,写的太多.可以使用Linq的方式,Linq比较简单写的也少.参考我的这篇文章的2018 ...

  6. 学习windows编程 day4 之 多边矩形填充

    #include <windows.h> #include <math.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, ...

  7. windows Zookeeper本地服务化

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  8. C# 简单线程实例

    1.简单线程实例 以及委托(同步委托.异步委托) using System; using System.Collections.Generic; using System.Linq; using Sy ...

  9. Linux - rar 压缩

    Linux - rar yum -y install libstdc++.so. wget http://rarsoft.com/rar/rarlinux-4.0.1.tar.gz cd rar ma ...

  10. oracle锁表

    一.锁表的处理 Oracle锁表比较简单,查询锁表的session杀掉就可以了. 1.以下几个为相关表 SELECT * FROM V$LOCK; SELECT * FROM V$SQLAREA; S ...