[agc006D]Median Pyramid Hard-[二分+乱搞]
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-[二分+乱搞]的更多相关文章
- [NOIP模拟赛][并没有用二分][乱搞AC]
圆圈舞蹈 [问题描述] 熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞.由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺时针走和逆时针走,到达 ...
- Codeforces 1077E (二分乱搞或者dp)
题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少? 思路1(乱搞):记录一下每种元素的个数,然后暴力 ...
- bzoj1992鬼谷子的钱袋(二分乱搞 二进制)
1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3223 Solved: 2333 Descriptio ...
- [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)
传送门 可以二分边长 然后另开两个数组,把x从小到大排序,把y从小到大排序 枚举x,可以得到正方形的长 枚举y,看看从这个y开始,往上能够到达多少个点,可以用类似队列来搞 其实发现算法的本质之后,x可 ...
- AT2165 Median Pyramid Hard 二分答案 脑洞题
无论再来多少次也不可能想到的写法. 二分一个最小的顶端值\(k\),大于设为\(1\)小于等于设为\(0\),可以证猜出来(你跟我说这可以?)如果存在两个连在一起的0/1那么它们会一直往上跑,还可以很 ...
- SCU 4437 Carries(二分乱搞)题解
题意:问任意两对ai,aj相加的总进位数为多少.比如5,6,95分为(5,6)(5,95)(6,95),进位数 = 1 + 2 + 2 = 5 思路:显然暴力是会超时的.我们可以知道总进位数等于每一位 ...
- AGC006D Median Pyramid Hard
闲扯 今天模拟的题,应该是挺简单的二分和贪心,就是没想出来,我好弱啊 顺便ORZ聚聚BLUESKY007,踩爆我了 思路 今天发现中位数性质如此优秀 二分最后塔顶的数,大于等于它的数变为1,小于它的数 ...
- [AGC006] D - Median Pyramid Hard 二分
Description 现在有一个NN层的方块金字塔,从最顶层到最底层分别标号为1...N1...N. 第ii层恰好有2i−12i−1个方块,且每一层的中心都是对齐的. 这是一个N=4N=4的 ...
- 【bzoj5085】最大(二分+乱搞)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5085 这道题我们可以先二分答案,然后转化为判定是否有四角权值>=mid的矩形. ...
随机推荐
- 快速搭建redis单机版和redis集群版
单机版 第一步:需要安装redis所需的C语言环境,若虚拟机联网,则执行 yum install gcc-c++ 第二步:redis的源码包上传到linux系统 第三步:解压缩redis tar ...
- Requests中文乱码解决方案
分析: r = requests.get(“http://www.baidu.com“) **r.text返回的是Unicode型的数据. 使用r.content返回的是bytes型的数据. 也就是说 ...
- 【题解】前k大子段和
题目描述 Peter喜欢玩数组.NOIP这天,他从Jason手里得到了一个大小为\(n\)的数组. Peter求出了这个数组的所有子段和,并将这\(\frac{n(n+1)}{2}\)个数降序排列,他 ...
- 【[JXOI2017]加法】
江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...
- Loading dl-debug.c in gdb / Ubuntu 14.04.4 LTS
转自: https://stackoverflow.com/questions/36025694/loading-dl-debug-c-in-gdb-ubuntu-14-04-4-lts ====== ...
- SPOJ 4487. Can you answer these queries VI splay
题目链接:点击打开链接 题意比較明显,不赘述. 删除时能够把i-1转到根,把i+1转到根下 则i点就在 根右子树 的左子树,且仅仅有i这一个 点 #include<stdio.h> #in ...
- Oracle分析函数巧妙使用
在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...
- 01 Oracle分区索引
Oracle分区索引 索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局 ...
- Java编写画图板程序细节-保存已画图形
没有Java编写画图板程序细节-保存已画图形 一.为何我们要保存画图板上已画图形呢? 有很多人会问,为什么我们一定要保存画图板上已经画好了的图形呢?原因很简单.当我们在画图板上画完自己想画的图形后 ...
- 前端基础-BOM和DOM的介绍
阅读目录 BOM和DOM的简述 DOM详细操作 事件 一.BOM和DOM的简述 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我 ...