题目链接:戳我

一看范围1e5,往二分上想。

可是再怎么也没有想到这个神仙的二分答案qwq

我们二分一个数x,设比他大的数为1,小于等于他的数为0。那么我们就可以把原来的那个转化成一个01塔。

然后我们可以通过实验发现,如果有连续的0或者1的话,它一定会向上面推进一格qwqwq。然后谁最先占领最上面的那个格子——如果是1,就是当前枚举的答案小了,反之则大。

所以我们直接寻找哪个连续两个或以上的数离中轴线更近qwq即可。

这样子时间复杂度是木有问题,二分一个log,查询的话最劣也是O(n)。

但是有一种例外,就是01交替分布,不存在两个或以上连续的。那我们就查不到了!

不过没有关系,这种特判一下即可。第一个是0的话最终上面的就是0,第一个是1的话最终就是1。(为什么?手动绘图一下即可)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200010
using namespace std;
int n,l,r,mid;
int a[MAXN];
inline bool check_large(int x,int y)
{
if(a[x]>mid&&a[y]>mid) return true;
return false;
}
inline bool check_small(int x,int y)
{
if(a[x]<=mid&&a[y]<=mid) return true;
return false;
}
inline bool solve()
{
for(int i=0;i<n-1;i++)
{
if(check_large(n+i,n+i+1)||check_large(n-i,n-i-1)) return true;
if(check_small(n+i,n+i+1)||check_small(n-i,n-i-1)) return false;
}
if(a[1]<=mid) return false;
else return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n*2-1;i++) scanf("%d",&a[i]);
l=1,r=2*n-1;
while(l<r)
{
mid=(l+r)>>1;
if(solve()==true) l=mid+1;
else r=mid;
}
printf("%d\n",l);
return 0;
}

小蒻菜实在是没有想到这种神仙做法,表示自己还是太菜了qwqwq

AT2165 Median Pyramid Hard的更多相关文章

  1. AT2165 Median Pyramid Hard 二分答案 脑洞题

    无论再来多少次也不可能想到的写法. 二分一个最小的顶端值\(k\),大于设为\(1\)小于等于设为\(0\),可以证猜出来(你跟我说这可以?)如果存在两个连在一起的0/1那么它们会一直往上跑,还可以很 ...

  2. B - Median Pyramid Easy 构造题

    B - Median Pyramid Easy Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statemen ...

  3. 【AtCoder】【模型转化】【二分答案】Median Pyramid Hard(AGC006)

    题意: 给你一个排列,有2*n-1个元素,现在进行以下的操作: 每一次将a[i]替换成为a[i-1],a[i],a[i+1]三个数的中位数,并且所有的操作是同时进行的,也就是说这一次用于计算的a[], ...

  4. AGC006D Median Pyramid Hard

    闲扯 今天模拟的题,应该是挺简单的二分和贪心,就是没想出来,我好弱啊 顺便ORZ聚聚BLUESKY007,踩爆我了 思路 今天发现中位数性质如此优秀 二分最后塔顶的数,大于等于它的数变为1,小于它的数 ...

  5. [agc006D]Median Pyramid Hard-[二分+乱搞]

    Description 题目大意:给你一个长度为n*2-1的排列,将除了该序列头尾的两个数外的其他数(设为i)变为原序列i-1,i,i+1下标数的中位数.求最后的数是什么.例子如下: Solution ...

  6. [AGC006] D - Median Pyramid Hard 二分

    Description ​ 现在有一个NN层的方块金字塔,从最顶层到最底层分别标号为1...N1...N. ​ 第ii层恰好有2i−12i−1个方块,且每一层的中心都是对齐的. 这是一个N=4N=4的 ...

  7. [AGC06D] Median Pyramid Hard (玄学)

    Description 现在有一个N层的方块金字塔,从最顶层到最底层分别标号为1...N. 第i层恰好有2i−1个方块,且每一层的中心都是对齐的. 这是一个N=4的方块金字塔 现在,我们首先在最底层填 ...

  8. $AT2163\ Median\ Pyramid\ Easy$ 构造

    正解:构造 解题报告: 传送门$QwQ$ 考虑如果有两个相邻格子是相同数字那么它们以上这两列就都会是这列数字(显然$QwQ$? 所以考虑只要构造出第$n-1$行的中心和中心右侧($or$左侧一样的$Q ...

  9. [atAGC006D]Median Pyramid Hard

    二分答案,考虑答案是否会大于等于这个mid,显然所有数值分为两类:大于等于mid和小于mid将n个数转化为01串,如果0和1不相邻,那么答案就是第一个数/最后一个数(一定会相同),考虑有连续两个0/1 ...

随机推荐

  1. 3DMAX导出FBX的烘焙动画选项

    勾选了 [烘焙动画]选项时,表示由骨骼动画塌陷为逐帧动画,这样的结果就是:导出的动画确保是正确的,但体积增大,这是骨骼动画与逐帧去画的区别所在. 如果不勾选此选项,则导出的是骨骼动画,可能出现一些问题 ...

  2. 调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题

    在运用Entity Framework调用存储过程的时候,遇到"调用EF的存储过程报"调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题 ...

  3. margin+absolute布局:右栏固定主内容自适应 demo

    margin+absolute布局:右栏固定主内容自适应 demo 头部 Aside侧边栏区域 Main主内容区域 底部 #demo{width:80%;margin:auto;height:300p ...

  4. <转>Linux环境进程间通信(五): 共享内存(下)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html 系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通 ...

  5. Unity内存优化

    [Unity内存优化] 1.在Update方法或循环中,少用string类,因为string类的每次操作都会调用new生成新字符串对象.用StringBuilder代替string,StringBui ...

  6. S数据导入

    一. 职责下的视图导入先对比UAT172和PROD 177的数据,若177比172多的数据进行删除,若172比177多的数据,重新加入到177. 1.删除177多余的 搜索一个177比172多的,进行 ...

  7. java tomcat报错: Starting Tomcat v7.0 Server at localhost' has encountered a problem问题

    运行web项目的时候出现下面错误: 出现这个问题的原因是 这个tomcat在其他项目中正在运行 关掉即可.

  8. 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init

    在configure中运行完auto/options脚本后,接着运行auto/init脚本,其中所做的工作如下. 1 Makefile文件名变量 默认情况下是: objs/Makefile 代码如下: ...

  9. unity与android交互总结

    http://www.jianshu.com/p/4739ce2f4cd1 http://www.cnblogs.com/suoluo/p/5443889.html http://www.th7.cn ...

  10. redis高可用 - 主从复制

    工作需要,调研了一下redis的复制实现.在2.8版本之前和之后,复制方式有所不同.2.8之前的复制方式对于初次复制数据没有问题,对于断连接重新复制比较耗性能,因为都是全量复制.2.8之后对断线重连做 ...