【AtCoder】【模型转化】【二分答案】Median Pyramid Hard(AGC006)
题意:
给你一个排列,有2*n-1个元素,现在进行以下的操作:
每一次将a[i]替换成为a[i-1],a[i],a[i+1]三个数的中位数,并且所有的操作是同时进行的,也就是说这一次用于计算的a[],是这一次计算之前的那个a[]。每一次不操作开头和结尾的两个位置。这样子每一次都会减少2个元素,问你最后剩下的元素是什么。
数据范围:
1<=N<=10^5
思路:
看见这道题正解是二分的时候,简直震惊!(考试的时候一直想的是计算每一项在最终序列中的系数来做)。
我们可以二分出一个值x,将所有小于等于x的数都变为0,将所有的大于x的数都变为1,然后再来看待这个问题。
下面建议读者一边画图一边来看。
首先定义一种状态,叫做柱子。也就是当存在连续的两个相同的数字的时候,这两个数字的上方会连续出现两个一样的数字,直到成为最左边或者是最右边的数字而被删除为止。
我们考虑哪些状态下,顶层的数字会是0。假如说这个问题解决了,就可以二分了。
- 顶端的正下方就有一根值为0的柱子,这个时候根据柱子的定义是显然成立的;
- 顶端的左边或者是右边有一根值为0的柱子,而另一边没有柱子。如果你画一下图就会发现,对于没有柱子的区域而言,那么必定是0101010...交错排列的。那么当前的这根0的柱子就能够保证到达某一层之后,右边的端点一定是0。这个时候就可以划归到第5种情况了;
- 顶端的两端都有柱子,且都是0的柱子。如果说状态2成立的话,那么这个也是显然成立的;
- 顶端的两端都有柱子,且一边最靠近顶端的柱子值为0,令一端最靠近顶端的柱子值为1,并且要求0柱子更加靠近1柱子。这个比较好想。到达某一层之后,1的柱子消失了,而这个时候0柱子至少还存在1个,且存在1个的时候还是再端右端点上。那么仍然能够划归到情况5;
- 顶端的两端都没有柱子,且底层的两端都是0,也就是num0=num1+1。如果稍微画一下图你就能发现,这样子0101010交错着上去,每一层都是这样子交错的,且都是两端为0。那么这样子到了次顶端的时候必定是010,然后顶端就是0了。
这样子对于一个01的序列直接O(n)判断就好了,总时间为O(nlogn)。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100000
using namespace std;
int N,a[2*MAXN+5];
bool seq[2*MAXN+5];
int Check(int x)
{
for(int i=1;i<=2*N-1;i++)
if(a[i]<=x)
seq[i]=0;
else
seq[i]=1;
if(seq[N]==seq[N-1]||seq[N]==seq[N+1])
return seq[N];//判断顶端的正下方有没有柱子
int l=-1,r=-1;
int ld,rd;
for(int i=2;i<=N;i++)
if(seq[i]==seq[i-1])
l=seq[i],ld=N-i+1;//计算左边的柱子类型以及距离
for(int i=N;i<2*N-1;i++)
if(seq[i]==seq[i+1])
{
r=seq[i];//计算右边的柱子类型以及距离
rd=i-N+1;
break;
}
if((l==0&&r==-1)||(l==-1&&r==0)||(l==0&&r==0))//情况2和3
return 0;
if((l==1&&r==0&&ld>rd)||(l==0&&r==1&&ld<rd))//情况4
return 0;
if(l==-1&&r==-1&&seq[1]==0)//情况5
return 0;
return 1;
}
int main()
{
// freopen("mid.in","r",stdin);
// freopen("mid.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=2*N-1;i++)
scanf("%d",&a[i]);
int L=0,R=2*N;
while(L<R)
{
int mid=(L+R)/2;
if(Check(mid)==0)//O(n)判断
R=mid;
else
L=mid+1;
}
printf("%d\n",R);
return 0;
}
【AtCoder】【模型转化】【二分答案】Median Pyramid Hard(AGC006)的更多相关文章
- Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)
Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...
- AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...
- Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)
貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的... 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数. 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第 ...
- POJ 3579 Median(二分答案+Two pointers)
[题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...
- POJ 3579 Median 【二分答案】
<题目链接> 题目大意: 给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数. 解题分析: 由于本题n达到了1e5,所以将这些数之间 ...
- 2018.10.14 NOIP训练 直线(二分答案+st表+切比雪夫距离转化)
传送门 二分答案好题. 这已经是当年普及组模拟时挖的坑了233. 这道题还是很不错的. 考虑把坐标系转个45度再操作. 为了不爆精度可以直接转切比雪夫距离. 然后就直接二分答案. 其中竖线就按二分的答 ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- [AGC006] D - Median Pyramid Hard 二分
Description 现在有一个NN层的方块金字塔,从最顶层到最底层分别标号为1...N1...N. 第ii层恰好有2i−12i−1个方块,且每一层的中心都是对齐的. 这是一个N=4N=4的 ...
- 【二分答案】【POJ3122】【Northwestern Europe 2006】Pie
Pie Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10629 Accepted: 3744 Special Ju ...
- BZOJ_2600_[Ioi2011]ricehub_二分答案
BZOJ_2600_[Ioi2011]ricehub_二分答案 Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均 为一个 1 到 L 之间(含 ...
随机推荐
- RTC子系统
目录 RTC子系统 引入 hctosys.c interface.c class.c 小结 流程一览 框架分析 rtc_init rtc_device_register s3c_rtc_probe o ...
- 统计iis日志第一例的次数
统计iis日志第一例(日期)出现的次数 IIS日志文件格式: #Software: Microsoft Internet Information Services 7.5 #Version: 1.0 ...
- nginx第三方库安装以及连接memcache
一.nginx第三方模块的安装 第三方模块查询地址:https://www.nginx.com/resources/wiki/modules/ 后来新出来一个nginx memcache增强版,有空可 ...
- SEO总结
学习了这么久了seo,对学过的知识进行一下总结. 服务器和域名 首先的一个就是对服务器和域名的选择,服务器最好能是独立的,因为如果不是独立服务器很容易被别人放在服务器上的网站所影响,然后就是域名,需要 ...
- css浮动(float)全方位案例解析
前言 浮动最早的使用是出自<img src="#" align="right" />,用于文本环绕图片的排版处理.当然也是一种常用的布局方式. fl ...
- ArcGIS Server 10.0 安装及使用完整攻略
引言 ArcGIS Server 10.0在使用和安装的过程中,需要进行比较全面的学习,才能正确使用.缺乏正确的指引,用户很容易在安装及使用中遇到问题.所以笔者在此总结Server 10.0的安装及使 ...
- jQuery AJAX 方法 success()后台传来的4种数据
JAVA中的四种JSON解析方式详解 jQuery AJAX 方法 success()后台传来的4种数据 1.后台返回一个页面 js代码 /**(1)用$("#content-wrapper ...
- mysql常见的问题
1.为什么选择某一个版本 各个版本之间的区别及优缺点 首先,服务器特性 mysql percona mysql mariaDB 开源 开源 开源 支持分区表 支持分区表 支持分区表 innodb Xt ...
- SSH框架之hibernate《二》
Hibernate第二天 一.hibernate的持久化类和对象标识符 1.1持久化类的编写规范 1.1.1什么是持久化类: ...
- Git——如何将本地项目提交至远程仓库(第一次)
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库. git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数 ...