博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解 楼房重建
阅读量:4631 次
发布时间:2019-06-09

本文共 2198 字,大约阅读时间需要 7 分钟。

 

解析

这题dalao们用线段树可以轻松切掉。。。

然而,本蒟蒻却喜欢用神(bao)奇(li)的数据结构,

于是,我们来讲一下分块做法。(顺便说一下对于某些数据可能得吸氧qwq)

首先,分析题意,

看得见一栋楼房,也就是(0,0)与这栋楼房的顶点的连线的斜率比之前的所有楼房高。

因此,看得见的楼房数也就是斜率递增序列的长度,

另外,计算长度时必须要把每栋楼房都算进去(也就是说并不是最长上升子序列

那么,我们只需要在每个块中维护一个上升序列,

对于修改,也是直接暴力。

具体做法(看不懂可以看后面完整代码):

inline void reset(int x)/*寻找上升序列*/{    bl[x].top=0;    for(int i=(x-1)*gap+1;i<=x*gap;i++){        if(cmp(i,bl[x].stack[bl[x].top])) bl[x].stack[++bl[x].top]=i;    }}

 

在询问时二分查找每个块中第一个能与之前所有块中的序列构成上升序列的元素,

那么上升序列中它后面的所有元素就都可以加在答案中了。

具体做法:

inline void work()/*统计答案*/{    int ans=0,tem=0;    for(int i=1;i<=b[n];i++)/*二分找每个块*/{        int l=1,r=bl[i].top;        int ret=0;        while(l<=r){            int mid=(l+r)>>1;            if(cmp(bl[i].stack[mid],tem)){r=mid-1;ret=mid; }            else l=mid+1;        }        if(ret) ans+=bl[i].top-ret+1,tem=bl[i].stack[bl[i].top];    }    printf("%d\n",ans);}

 

 

具体看完整代码吧:

#include 
#include
#include
#define ll long longusing namespace std; inline int read(){ int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){
if(c=='-') f=-1;c=getchar();} while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();} return x*f;} struct block{ int top;//序列的长度 int stack[404];//名字不重要}bl[404];//块的信息int n,m,gap;int a[100001]/*高度*/,b[100001]/*块*/; bool cmp(int x,int y)/*比较斜率*/{ if(!y) return a[x]>0; return (ll)x*a[y]<(ll)y*a[x];//避免精度误差将除法转换成乘法} inline void reset(int x)/*寻找上升序列*/{ bl[x].top=0; for(int i=(x-1)*gap+1;i<=x*gap;i++){ if(cmp(i,bl[x].stack[bl[x].top])) bl[x].stack[++bl[x].top]=i; }} inline void work()/*统计答案*/{ int ans=0,tem=0; for(int i=1;i<=b[n];i++)/*二分找每个块*/{ int l=1,r=bl[i].top; int ret=0; while(l<=r){ int mid=(l+r)>>1; if(cmp(bl[i].stack[mid],tem)){r=mid-1;ret=mid; } else l=mid+1; } if(ret) ans+=bl[i].top-ret+1,tem=bl[i].stack[bl[i].top]; } printf("%d\n",ans);} int main(){ n=read();m=read(); gap=sqrt(n); for(int i=1;i<=n;i++) b[i]=(i-1)/gap+1; while(m--){ int p=read(); a[p]=read(); reset(b[p]); work(); } return 0;}

 

转载于:https://www.cnblogs.com/zsq259/p/10566951.html

你可能感兴趣的文章
3.1、final、finally、 finalize
查看>>
国家气象局提供的天气预报接口
查看>>
MongoDB 删除数据库
查看>>
前端基础之JQuery
查看>>
hdu 3664 1~n排列(ai>i ) 为k个数
查看>>
AppStore SDK
查看>>
java多线程
查看>>
springboot 学习笔记(三)
查看>>
Nginx 主要应用场景
查看>>
记录一次爬取某昵称网站的爬虫
查看>>
lattice diamond 3.7安装破解
查看>>
FPGA研发之道(25)-管脚
查看>>
BFS之三(单向bfs和康托压缩)
查看>>
Web App、Hybrid App与Native App的设计差异
查看>>
ASP.NET将原始图片按照指定尺寸等比例缩放显示图片
查看>>
测试用例设计方法基础理论知识
查看>>
基于visual Studio2013解决面试题之0804复杂链表
查看>>
find_in_set
查看>>
【转帖】SQLServer登录连接失败(error:40-无法打开到SQLServer的连接)的解决方案...
查看>>
ibatis的there is no statement named xxx in this SqlMap
查看>>