还是用到了离散化和二分查找的一个题目,题目是求每段线段可以达到最大的矩形面积,再求总和。

  1. /*  Name: City Horizon
  2. Date: 31-07-08 17:06
  3. Description: 离散化+二分查找 用了个链表
  4. */
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<algorithm>
  8. #define pr printf
  9. __int64 x[100003];
  10. int b[100003];
  11. struct stt{
  12. int s,e,h;
  13. }a[50003];
  14. int c[100003];
  15. int cmp(const void * a,const void * b){
  16. return (int)(*(__int64 *)a-*(__int64 *)b);
  17. }
  18. int cmp2(const void * b,const void *a){
  19. return ((stt *)a)->h-((stt *)b)->h;
  20. }
  21. //二分查找排序数组,返回匹配元素位置
  22. int search_bin(__int64 *t,__int64 k,int start,int end)
  23. {  // t为待查数组,k为匹配元素,start数组起始位置,end数组结束位置
  24. int low=start,high=end-1,mid;
  25. while (low<=high)
  26. {
  27. mid=(low+high)/2;
  28. if (k==t[mid]) return mid;
  29. else if (k<t[mid]) high=mid-1;
  30. else low=mid+1;
  31. }
  32. return -1;
  33. }
  34. int main(){
  35. int i,n,s,e,h,k;
  36. scanf("%d",&n);
  37. FILE *pp=fopen("temp.txt","w");
  38. for(i=0,k=0;i<n;i++,k++)
  39. {
  40. scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].h);
  41. x[k]=a[i].s,x[++k]=a[i].e;
  42. }
  43. for(i=0;i<2*n;i++)c[i]=0;
  44. qsort(x,2*n,sizeof(__int64),cmp);//将x坐标离散
  45. qsort(a,n,sizeof(a[1]),cmp2);//按高度排序
  46. __int64 sum=0,len;
  47. int x1,j,x2,next;
  48. for(i=0;i<2*n-1;i++)
  49. {
  50. b[i]=i+1;//初始化链表
  51. }
  52. for(i=0;i<n;i++)
  53. {
  54. s=a[i].s,e=a[i].e,h=a[i].h;
  55. x1=search_bin(x,s,0,2*n);
  56. x2=search_bin(x,e,0,2*n);
  57. len=0;
  58. for(j=x1;j<x2 && j<2*n;j=next)//链表是关键,保证了每个点只会便利一次
  59. {
  60. if(c[j]==0)//没有访问过的点
  61. {
  62. c[j]=1;
  63. len+=(x[j+1]-x[j]);
  64. next=b[j];
  65. b[j]=x2;
  66. }else next=b[j];//被覆盖的点根据链表找到下一点索引
  67. }
  68. sum+=len*h;
  69. }
  70. pr("%I64d/n",sum);
  71. scanf("%d",&i);
  72. }
  73. /*
  74. 4
  75. 1 15 1
  76. 3 7 4
  77. 3 12 5
  78. 5 8 3
  79. */

pku3277 City Horizon.(离散化+二分查找)相关推荐

  1. 离散化+unique()+二分查找

    离散化 引自百度百科 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,1 ...

  2. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  3. bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)

    P2061 [USACO07OPEN]城市的地平线City Horizon 扫描线 扫描线简化版 流程(本题为例): 把一个矩形用两条线段(底端点的坐标,向上长度,添加$or$删除)表示,按横坐标排序 ...

  4. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  5. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  6. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  7. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  8. 二分查找算法的一点改进

    在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...

  9. 二分法:二分查找(递归+非递归)实现

    二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...

  10. python数据结构与算法:二分查找

    二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...

最新文章

  1. 格式化的盘要怎么寻回文件
  2. web项目性能优化--网络、js、渲染
  3. hdu-1422(简单dp)
  4. java遍历本地文件夹_JAVA遍历一个文件夹中的所有文件的小例子
  5. 使用Blazor做个简单的时间戳在线转换工具
  6. 【神经网络八股扩展】:数据增强
  7. 数学江湖中的“独孤九剑”
  8. 原神创意工坊工具箱2.0源码-小程序前端源码
  9. 凯兑换系统服务器角色,能够在所有局中通用的角色,游走于各个线路,单挑很强的凯...
  10. 软件项目经理新手上路16 - 后记,一切才刚刚开始
  11. 时间定位表达式-用于时间的加、减调整
  12. java 向文件写数据结构_Java Note 数据结构(5)映射
  13. pngimg 可以商用吗_全球6大免费商用素材网!设计师必备!
  14. 用 DiskGenius 和 HDD Regenerator 修复硬盘逻辑坏道和隐藏物理坏道
  15. Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
  16. 通信感知一体化技术思考
  17. 2004年9月13日
  18. EF系列(二)——DbContext 和DbSet
  19. macs14_iPhone和iPad应用程序将能够在基于ARM的Macs上本地运行
  20. uniapp项目 vue create -p dcloudio/uni-preset-vue my-project下载失败

热门文章

  1. 存储系统的实现-探析存储的机制和原理
  2. 常用SQL语句汇总整理
  3. ssh与tcp wappers
  4. Security+ 学习笔记5 常见的网络攻击
  5. WLAN射频、信道与帧分类
  6. Thread 类的属性和方法
  7. java 正则表达式提取字符串
  8. vue 报错 :属性undefined(页面成功渲染)
  9. linux下的系统服务管理及日志管理
  10. android 调用百度地图,高德地图第三方APP进行导航