pku3277 City Horizon.(离散化+二分查找)
还是用到了离散化和二分查找的一个题目,题目是求每段线段可以达到最大的矩形面积,再求总和。
- /* Name: City Horizon
- Date: 31-07-08 17:06
- Description: 离散化+二分查找 用了个链表
- */
- #include<stdio.h>
- #include<stdlib.h>
- #include<algorithm>
- #define pr printf
- __int64 x[100003];
- int b[100003];
- struct stt{
- int s,e,h;
- }a[50003];
- int c[100003];
- int cmp(const void * a,const void * b){
- return (int)(*(__int64 *)a-*(__int64 *)b);
- }
- int cmp2(const void * b,const void *a){
- return ((stt *)a)->h-((stt *)b)->h;
- }
- //二分查找排序数组,返回匹配元素位置
- int search_bin(__int64 *t,__int64 k,int start,int end)
- { // t为待查数组,k为匹配元素,start数组起始位置,end数组结束位置
- int low=start,high=end-1,mid;
- while (low<=high)
- {
- mid=(low+high)/2;
- if (k==t[mid]) return mid;
- else if (k<t[mid]) high=mid-1;
- else low=mid+1;
- }
- return -1;
- }
- int main(){
- int i,n,s,e,h,k;
- scanf("%d",&n);
- FILE *pp=fopen("temp.txt","w");
- for(i=0,k=0;i<n;i++,k++)
- {
- scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].h);
- x[k]=a[i].s,x[++k]=a[i].e;
- }
- for(i=0;i<2*n;i++)c[i]=0;
- qsort(x,2*n,sizeof(__int64),cmp);//将x坐标离散
- qsort(a,n,sizeof(a[1]),cmp2);//按高度排序
- __int64 sum=0,len;
- int x1,j,x2,next;
- for(i=0;i<2*n-1;i++)
- {
- b[i]=i+1;//初始化链表
- }
- for(i=0;i<n;i++)
- {
- s=a[i].s,e=a[i].e,h=a[i].h;
- x1=search_bin(x,s,0,2*n);
- x2=search_bin(x,e,0,2*n);
- len=0;
- for(j=x1;j<x2 && j<2*n;j=next)//链表是关键,保证了每个点只会便利一次
- {
- if(c[j]==0)//没有访问过的点
- {
- c[j]=1;
- len+=(x[j+1]-x[j]);
- next=b[j];
- b[j]=x2;
- }else next=b[j];//被覆盖的点根据链表找到下一点索引
- }
- sum+=len*h;
- }
- pr("%I64d/n",sum);
- scanf("%d",&i);
- }
- /*
- 4
- 1 15 1
- 3 7 4
- 3 12 5
- 5 8 3
- */
pku3277 City Horizon.(离散化+二分查找)相关推荐
- 离散化+unique()+二分查找
离散化 引自百度百科 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,1 ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)
P2061 [USACO07OPEN]城市的地平线City Horizon 扫描线 扫描线简化版 流程(本题为例): 把一个矩形用两条线段(底端点的坐标,向上长度,添加$or$删除)表示,按横坐标排序 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- LeetCode简单题之二分查找
题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 二分查找算法的一点改进
在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...
- 二分法:二分查找(递归+非递归)实现
二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...
- python数据结构与算法:二分查找
二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...
最新文章
- 格式化的盘要怎么寻回文件
- web项目性能优化--网络、js、渲染
- hdu-1422(简单dp)
- java遍历本地文件夹_JAVA遍历一个文件夹中的所有文件的小例子
- 使用Blazor做个简单的时间戳在线转换工具
- 【神经网络八股扩展】:数据增强
- 数学江湖中的“独孤九剑”
- 原神创意工坊工具箱2.0源码-小程序前端源码
- 凯兑换系统服务器角色,能够在所有局中通用的角色,游走于各个线路,单挑很强的凯...
- 软件项目经理新手上路16 - 后记,一切才刚刚开始
- 时间定位表达式-用于时间的加、减调整
- java 向文件写数据结构_Java Note 数据结构(5)映射
- pngimg 可以商用吗_全球6大免费商用素材网!设计师必备!
- 用 DiskGenius 和 HDD Regenerator 修复硬盘逻辑坏道和隐藏物理坏道
- Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
- 通信感知一体化技术思考
- 2004年9月13日
- EF系列(二)——DbContext 和DbSet
- macs14_iPhone和iPad应用程序将能够在基于ARM的Macs上本地运行
- uniapp项目 vue create -p dcloudio/uni-preset-vue my-project下载失败