【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 之间(含 ...
随机推荐
- Tomcat 部署java web项目直接ip地址访问项目
正常情况下,在访问在Tomcat中部署的项目是 http://localhost:8080/demo 方式 其中,IP,端口,项目名(Demo)都是必须的. 那么,怎么样才能通过 http://loc ...
- echarts 修改y轴刻度间隔问题
其中min.max可以自定义可以动态获取数据 yAxis : [ { type : 'value', axi ...
- Gym - 101350A Sherlock Bones(思维)
The great dog detective Sherlock Bones is on the verge of a new discovery. But for this problem, he ...
- python操作文件练习,配置haproxy
在使用python操作文件的时候,特别是对于网络设备,通常操作配置文件,会简化配置量,配置文件加载到内存中,运行时使用的是内存中的配置,内存中配置修改后立即生效,如果不将配置内容保存到硬盘中,则下次重 ...
- Go-常用库的介绍
一.Go常用包介绍 fmt.它实现了格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开 发者使用最为频繁的函数. io.它实现了一系列非平台相关的IO相关接口 ...
- Entity Framework入门教程(18)---EF6中基于代码进行配置方式
EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...
- JGUI源码:解决手机端点击出现半透明阴影(4)
下面开始进入正题,问题发现与解决 1.According解决手机浏览器点击出现半透明阴影 手机下点击有白色蒙版,原始效果如下,看起来很不协调 2.解决办法:增加 -webkit-tap-highlig ...
- Tupper自我指涉公式生成器
- vue组件化的应用
前言:vue组件化的应用涉及到vue-cli的内容,所以在应用之前是需要安装node和vue-cli的,具体如何安装我就不一一赘述了.可能一会儿我心情好的时候,可以去整理一下. 1.应用的内容:在一个 ...
- eclipse下classes文件夹无法发布到tomcat的问题--tomcat发布慢的问题
=== 解决eclipse下classes文件夹无法发布到tomcat的问题_Nautilus_新浪博客http://blog.sina.com.cn/s/blog_484d8777010130n5. ...