线段树求后继+环——cf1237D
/*
首先开三倍消环(两倍是不够的),倒序求值,线段树找一下后继即可
*/
#include<bits/stdc++.h>
using namespace std;
#define N 300005 int n,a[N],ans[N]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int Max[N<<],Min[N<<],pos1,pos2;
void build(int l,int r,int rt){
Max[rt]=;Min[rt]=1e9+;
if(l==r){
Max[rt]=Min[rt]=a[l];
return;
}
int m=l+r>>;
build(lson);build(rson);
Max[rt]=max(Max[rt<<],Max[rt<<|]);
Min[rt]=min(Min[rt<<],Min[rt<<|]);
}
void query1(int L,int R,int v,int l,int r,int rt){//找第一个比v大的后继
if(l==r){
if(Max[rt]>v)pos1=min(pos1,l);
return;
}
int m=l+r>>;
if(L<=l && R>=r){//可以在区间里二分了
if(Max[rt<<]>v)
query1(L,R,v,lson);
else if(Max[rt<<|]>v)
query1(L,R,v,rson);
return;
}
if(L<=m)query1(L,R,v,lson);
if(R>m)query1(L,R,v,rson);
}
void query2(int L,int R,double v,int l,int r,int rt){//找第一个比v小的后继
if(l==r){
if(Min[rt]<v)pos2=min(pos2,l);
return;
}
int m=l+r>>;
if(L<=l && R>=r){
if(Min[rt<<]<v)
query2(L,R,v,lson);
else if(Min[rt<<|]<v)
query2(L,R,v,rson);
return;
}
if(L<=m)query2(L,R,v,lson);
if(R>m)query2(L,R,v,rson);
} int main(){
cin>>n;
int mx=,mi=0x3f3f3f3f;
for(int i=;i<=n;i++){
cin>>a[i];
a[i+n]=a[i+*n]=a[i];
mx=max(mx,a[i]);
mi=min(mi,a[i]);
} if(mx<=mi*){
for(int i=;i<=n;i++)cout<<-<<" ";
return ;
} build(,*n,);
ans[*n]=;
for(int i=*n-;i>=;i--){
pos1=pos2=*n+;
query1(i+,*n,a[i],,*n,);//找第一个大于a[i]的位置
query2(i+,*n,1.0*a[i]/,,*n,);//找第一个小于a[i]/2的位置
if(pos1==*n+ && pos2==*n+)//后面都可行
ans[i]=*n-i+;
else if(pos1==*n+)//后面没有比a[i]大的
ans[i]=pos2-i;
else if(pos2==*n+)//后面没有比a[i]/2小的
ans[i]=ans[pos1]+pos1-i;
else if(pos1<pos2)//大的在小的前面
ans[i]=ans[pos1]+pos1-i;
else if(pos1>pos2)
ans[i]=pos2-i;
}
for(int i=;i<=n;i++)
cout<<ans[i]<<" ";
}
线段树求后继+环——cf1237D的更多相关文章
- cf1278D——树的性质+并查集+线段树/DFS判环
昨天晚上本来想认真打一场的,,结果陪女朋友去了.. 回来之后看了看D,感觉有点思路,结果一直到现在才做出来 首先对所有线段按左端点排序,然后用并查集判所有边是否联通,即遍历每条边i,和前一条不覆盖它的 ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- UVA 11983 Weird Advertisement --线段树求矩形问题
题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...
- BNU 2418 Ultra-QuickSort (线段树求逆序对)
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...
- hdu 1394 (线段树求逆序数)
<题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- 4163 hzwer与逆序对 (codevs + 权值线段树 + 求逆序对)
题目链接:http://codevs.cn/problem/4163/ 题目:
- poj2299 Ultra-QuickSort(线段树求逆序对)
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
随机推荐
- 【LeetCode 33】搜索旋转排序数组
题目链接 [题解] 会发现旋转之后,假设旋转点是i 则0..i-1是递增有序的.然后i..len-1也是递增有序的. 且nums[i..len-1]<nums[0]. 而nums[1..i-1] ...
- 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化
B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...
- 【Java架构:基础技术】一篇文章搞掂:MyBatis
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文主要总结于刘增辉的<MyBatisc从入门到精通>一书,有兴趣的朋友可以自行研读 建议仔细研读官方文档: http ...
- 68、Schema的相关类
public class SObjectSchema { public void testSchema(){ //获取SObject的token //1.先获取所有token,然后通过key获取需要的 ...
- vue消息提示Message
https://www.iviewui.com/components/message this.$Message.info(config) this.$Message.success(config) ...
- 详解代理自动配置 PAC
转自知乎 最近一直在做跨域中华局域网的工作,了解了很多代理知识和基础概念,很零散,也很细碎.希望通过一段时间的学习,能够自由地穿梭在国际互联网和中华局域网之间.后续会写一系列文章记录我了解到的知识点, ...
- Java封装JDBC数据库增、删、改、查操作成JAR文件,以供Web工程调用,适用于多种数据库
废话不多说,直接上源代码,最后有使用方法,当然,也可以作为普通公用类使用,只是封装成JAR更方便使用. package db.util; import java.io.BufferedReader; ...
- ACM-ICPC 比赛环境的使用
ACM-ICPC 现场赛不同的赛站可能比赛环境不同,不过一般都是 Ubuntu 系统.附带的软件可能略有不同,可能会有使用习惯的差异导致效率下降或者无法运行代码,但是在终端下编译运行代码都是相同的.本 ...
- 基于MFC的Media Player播放器的制作(1---播放器界面的布局)
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 通过上面的一些预备知识,我们现在就可以自己来制作基于MFC的播放器了,接下来我们讲的是使用MFC制作我们播放器 的界面. 首先,我们我们打 ...
- 使用 C++ 编写的基础 Windows 服务 (CppWindowsService)
最近项目中涉及到使用C++写一个后台服务程序,找了很多资料,还是使用Google搜索找到了比较详细点的资料,就是从微软官方MSDN的例子,如下: 使用 C++ 编写的基础 Windows 服务 (Cp ...