Description

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

        

Solution

这道题我们考虑二分(反正我YY了好久也没想出其他做法)。

我们设当前二分到k,要判断答案与k的大小关系。将原排列中<=k的数设为0,反之设为1。

如此我们可以得到一个01序列。

通过分析可得,假如01序列中有两个相邻的数相等,则它们正上方的所有数都与它们相等。(我们可以称之为柱子)

1

_ 1 1

_ _ 1 1 _

_ _ _ 1 1 _ _

则对于某个排列如果它最上方的数为0,有以下情况:

1,它的第n位是柱子。

2,以它的第n位为中心,左边或者右边只有为0的柱子

3,以它的第n位为中心,两边最近的柱子都为0

4,以它的第n位为中心,两边的柱子分别为0和1,但是0柱子离中心较近。

5,以它的第n位为中心,左右两边都没有柱子,则需要序列第1位为0。

以下为情况4的证明:

1|  1 1 1 1 1 0 0 0 0 0  |0

|  1 1 1 1 1 0 0 0 0 0  |0

1|  1 1 1 1 0 1 0 0 0 0  |0

1|  1 1 1 0 1 0 1 0 0 0  |0

1|  1 1 0 1 0 1 0 1 0 0  |0

1|  1 0 1 0 1 0 1 0 1 0  |0

1|  0 1 0 1 0 1 0 1 0 1  |0

该图左边是1柱子,右边是0柱子。依图可证明。

其他证明同理。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,a[],l,r,mid,ans;
bool _get(int x){ return !(x<=mid);}
bool check()
{
for (int i=;i<=n-;i++)
{
if (_get(a[n+i-])==_get(a[n+i])) return _get(a[n+i]);
if (_get(a[n-i+])==_get(a[n-i])) return _get(a[n-i+]);
}
return _get(a[]);
}
int main()
{
scanf("%d",&n);
for (int i=;i<=*n-;i++) scanf("%d",&a[i]);
l=;r=*n-;
while (l<=r)
{
mid=(l+r)/;
if (!check()) r=mid-,ans=mid;else l=mid+;
}
cout<<ans;
}

[agc006D]Median Pyramid Hard-[二分+乱搞]的更多相关文章

  1. [NOIP模拟赛][并没有用二分][乱搞AC]

    圆圈舞蹈 [问题描述] 熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞.由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺时针走和逆时针走,到达 ...

  2. Codeforces 1077E (二分乱搞或者dp)

    题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少? 思路1(乱搞):记录一下每种元素的个数,然后暴力 ...

  3. bzoj1992鬼谷子的钱袋(二分乱搞 二进制)

    1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3223  Solved: 2333 Descriptio ...

  4. [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)

    传送门 可以二分边长 然后另开两个数组,把x从小到大排序,把y从小到大排序 枚举x,可以得到正方形的长 枚举y,看看从这个y开始,往上能够到达多少个点,可以用类似队列来搞 其实发现算法的本质之后,x可 ...

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

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

  6. SCU 4437 Carries(二分乱搞)题解

    题意:问任意两对ai,aj相加的总进位数为多少.比如5,6,95分为(5,6)(5,95)(6,95),进位数 = 1 + 2 + 2 = 5 思路:显然暴力是会超时的.我们可以知道总进位数等于每一位 ...

  7. AGC006D Median Pyramid Hard

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

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

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

  9. 【bzoj5085】最大(二分+乱搞)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5085 这道题我们可以先二分答案,然后转化为判定是否有四角权值>=mid的矩形. ...

随机推荐

  1. mvvm模型

  2. ZooKeeper学习之路 (八)ZooKeeper原理解析

    ZooKeeper中的各种角色 ZooKeeper与客户端 每个Server在工作过程中有三种状态: LOOKING:当前Server不知道leader是谁,正在搜寻 LEADING:当前Server ...

  3. 关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法

    该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译, ...

  4. CentOS7开发环境搭建

    BIOS开启VT支持 查询笔记本进入BIOS的按键,启动BIOS的虚拟化设置 假设安装360卫士,那么请永久关闭Intel-VT核晶防护引擎 CentOS DNS配置 Linux 下设置DNS位置有3 ...

  5. 闲话缓存:ZFS 读缓存深入研究-ARC(一)

    在Solaris ZFS 中实现的ARC(Adjustable Replacement Cache)读缓存淘汰算法真是很有意义的一块软件代码.它是基于IBM的Megiddo和Modha提出的ARC(A ...

  6. Notes 20180507 : Java程序设计之环境搭建与HelloWord

    3 HelloWorld 不管从事什么工作那么一个工作环境总是必不可少的,那怕你只是要写篇文章,一张平坦的书桌和流利的书写笔总是能帮助我们完成工作的,Java开发更是如此.在开始今天的HelloWor ...

  7. WebClient 下载图片(文件)

    public static string SaveImage(string url, string newfilename) { WebClient mywebclient = new WebClie ...

  8. 工具 | Axure基础操作 No.5

    今天看了不少的关于产品思维的文章,甚有感悟.但是还是觉得一句话说的非常对,做产品就像游泳,你掌握了很多理论知识,只要一下水那些理论知识都没什么用,只有真正的一头扎进水里你才知道身体怎么去适应这样的感觉 ...

  9. @property & @synthesize & @dynamic 及相关属性作用探究

    @property : iOS6 引入关键词. @property name; 指示编译器自动生成 name 的 setter 和 getter 方法 : - (NSString *)name; - ...

  10. mysql数据库的导入导出命令

    1.备份一个数据库 mysqldump -h localhosot -uroot -ppassword 数据库名>数据库所在路径(路径+数据库名.sql) 注意:导出的数据库文件.sql文件不能 ...