【JSOI2016】【st表/猫树】【枚举】灯塔
【题目描述】
【思路】
这道题也很不错。首先这道题有O(nlogn)O(n\log n)O(nlogn)做法,但是我不会,我就只会O(nn)O(n \sqrt n)O(nn)+卡常的做法。这道题唯一的难度就在于那个根号。但是我们知道一个显而易见的性质,对于根号的值相同的所有的j,我们只需要用高度最大的j来更新i的答案。而根号值相同的显然在两侧都是连续的一段区间。根号的取值也不会很大,最多O(n)O(\sqrt n)O(n)种。所以我们考虑枚举根号的值,查询对应区间最大的hjh_jhj来更新答案。为了O(1)O(1)O(1)查询,我们需要用st表或猫树。然后这道题就差不多了。卡卡常就过了。
代码:
#include<bits/stdc++.h>
#define re register
#define mp make_pair
using namespace std;
const int N=5e5+5;
inline int red(){int data=0;char ch=getchar();while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=(data<<3)+(data<<1)+ch-'0',ch=getchar();return data;
}int n,m,a,b,c,h[N],len[N];
namespace cat{int f[19][N],pos[N],lim,lo[N];inline void build(int p,int l,int r,int dep){if(l==r)return(void)(pos[l]=p);int mid=(l+r)>>1;f[dep][mid]=h[mid];for(int re i=mid-1;i>=l;--i)f[dep][i]=h[i]>f[dep][i+1]?h[i]:f[dep][i+1];for(int re i=mid+1;i<=r;++i)f[dep][i]=h[i]>f[dep][i-1]?h[i]:f[dep][i-1];build(p<<1,l,mid,dep+1);build(p<<1|1,mid+1,r,dep+1);}inline void pre(){lim=1;while(lim<n)lim<<=1;for(int re i=2;i<=(lim<<1);i++)lo[i]=lo[i>>1]+1;build(1,1,lim,1);}inline int query(int l,int r){if(l==r)return h[l];int d=lo[pos[l]]-lo[pos[l]^pos[r]];return f[d][l]>f[d][r]?f[d][l]:f[d][r];}
}using namespace cat;
int ans[N];
inline void print(int x){if(x>9)print(x/10);putchar((x%10)^48);
}
inline int min(const int&a,const int&b){return a>b?b:a;}
inline int max(const int&a,const int&b){return a<b?b:a;}
inline void cmax(int&a,const int&b){(b>a)&&(a=b);}
int main(){n=red();int x=sqrt(n)+1;for(int re i=1;i<=x;i++)len[i]=i*i;for(int re i=1;i<=n;i++)h[i]=red();pre();for(int re i=1;i<=n;i++){bool f1=0,f2=0;for(int re j=1;j<=x;j++){if(i+len[j-1]<n)cmax(ans[i],query(i+len[j-1]+1,min(n,i+len[j]))-h[i]+j);else f1=1;if(i-len[j-1]>=0)cmax(ans[i],query(max(1,i-len[j]),i-len[j-1]-1)-h[i]+j);else f2=1;if(f1&&f2)break;}}for(int re i=1;i<=n;i++)print(ans[i]),putchar('\n');
}
【JSOI2016】【st表/猫树】【枚举】灯塔相关推荐
- 【st表/猫树】【堆+贪心】超级钢琴
[描述] 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队【st表||线段树】
要求区间取min和max,可以用st表或线段树维护 st表 #include<iostream> #include<cstdio> using namespace std; c ...
- 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)
文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai建权值线段树 再 ...
- CF1422F Boring Queries(ST表 + 主席树)
CF1422F Boring Queries 给定一个长度为nnn的数组a,(1≤ai≤2×105)a,(1 \leq a_i \leq 2 \times 10 ^ 5)a,(1≤ai≤2×105) ...
- 【洛谷3865】 【模板】ST表(猫树)
传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里 转载于:https://www.cnblogs.com/ml ...
- 【无码专区10】第K大查询(双向链表 /主席树+st表)
已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...
- 洛谷P4094 [HEOI2016/TJOI2016]字符串【后缀数组+主席树+st表】
时空限制 2000ms / 256MB 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的 ...
最新文章
- 操作系统实验2—实现动态分区分配模拟程序
- .Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示
- AWS elastic load balancer里的监听器certificate设置
- python执行linux和window的命令
- 使用ShellExecuteEx打开文件或者其他
- Type Dynamic Web Module 4.0 requires Java 1.8 or newer----彻底杀死Bug
- C++ {}作用域 return
- [数据结构] 树链剖分
- 很好用的查看PE文件的小工具---LordPE Deluxe 1.4 汉化版
- 回溯法——利用解空间树解决0-1背包问题
- prettier和beautify哪个好用
- 港股通与全球一体化投资交易系统实践
- vs2008 下配置 opencv2.0 的总结,以及 vc6 下配置 opencv1.0 的转帖
- 【无标题】2023速卖通开店教程,入驻图文讲解!
- C. Fishingprince Plays With Array
- 怎 样 寻 找 安 全 漏 洞 (转)
- Charles(Mac)抓取安卓手机app的包
- 图像数据的特征提取方法
- UpdateData用法解释
- unittest---unittest生成测试报告