LINK:牛牛的揠苗助长

题目很水 不过做法很多 想到一个近乎O(n)的做法 不过感觉假了 最后决定莽一个主席树 当然 平衡树也行。

容易想到 答案为ans天 那么一些点的有效增长项数为 ans%n.

那么其实可以直接枚举答案到底在哪个位置 那么问题转换成了 需要最少多少次 每次可以给每个数+1或者-1 使得整个序列数字相等。

容易想到最后答案中位数 即排序后a[n/2+1]。这样排个序数一下前后缀和即可。

不过 每次动态+1 求动态中位数这件事情 可以利用一个右指针扫描什么的 不过存在一些细节。

可以考虑 主席树做 注意求答案的时候要 考虑清楚 到底还需多少天。

当然 还可以二分。一开始虽然想到二分了 但是没有细想 以为不具有单调性。

容易发现 如果比答案要大 考虑先变成答案的样子 多出来的 天数 和 多出来的增长数可以抵消掉。

非常巧妙的是 具有单调性了。关于证明:比答案<n时 可以考虑 如果中位数没有变化那么显然可以,如果变化了设当前答案为ans1 如果按照之前的中位数来做设答案为ans2 显然存在ans1<=ans2 且如果按照之前的ans2来做可以 那么按照当前中位数来做也可以。

当比答案>n时 跟上面一样类似的证明。

我写的是主席树的做法。

const int MAXN=100010;
int n,maxx,root,id,sum;
int a[MAXN];ll ans=INF;
struct wy{int l,r,sum;ll cnt;}t[MAXN*30];
inline void insert(int &p,int l,int r,int x,int w)
{
if(!p)p=++id;
if(l==r){sum(p)+=w;if(w==1)cnt(p)+=x;else cnt(p)-=x;return;}
int mid=(l+r)>>1;
if(x<=mid)insert(l(p),l,mid,x,w);
else insert(r(p),mid+1,r,x,w);
sum(p)=sum(l(p))+sum(r(p));
cnt(p)=cnt(l(p))+cnt(r(p));
}
inline int ask(int p,int l,int r,int x)
{
if(l==r)return l;
int mid=(l+r)>>1;
if(sum(l(p))>=x)return ask(l(p),l,mid,x);
return ask(r(p),mid+1,r,x-sum(l(p)));
}
inline ll query(int p,int l,int r,int L,int R)
{
if(L>R)return 0;
if(L<=l&&R>=r){sum+=sum(p);return cnt(p);}
int mid=(l+r)>>1;ll ww=0;
if(L<=mid)ww+=query(l(p),l,mid,L,R);
if(R>mid)ww+=query(r(p),mid+1,r,L,R);
return ww;
}
int main()
{
//freopen("1.in","r",stdin);
get(n);int ww=n/2+1;
rep(1,n,i)get(a[i]),maxx=max(maxx,a[i]);
++maxx;
rep(1,n,i)insert(root,1,maxx,a[i],1);
rep(1,n,i)
{
insert(root,1,maxx,a[i],-1);
insert(root,1,maxx,a[i]+1,1);
sum=0;int cc=ask(root,1,maxx,ww);
ll kk=query(root,1,maxx,1,cc-1);
ll cnt=(ll)sum*cc-query(root,1,maxx,1,cc-1);
//putl((ll)sum*cc-query(root,1,maxx,1,cc-1));
//putl(cnt);put(sum);put(cc);putl(query(root,1,maxx,1,cc-1));
sum=0;kk=query(root,1,maxx,cc+1,maxx);cnt+=kk-(ll)sum*cc;
if(!cnt){ans=min(ans,(ll)i);continue;}
int now=cnt%n==0?n:cnt%n;
if(i>=now)ans=min(ans,cnt+i-now);
else ans=min(ans,n-now+i+cnt);
}
putl(ans);
return 0;
}

牛客练习赛63 C 牛牛的揠苗助长 主席树 二分 中位数的更多相关文章

  1. 牛客练习赛63 C.牛牛的揠苗助长

    题意:有一个长度为\(n\)的数组,从第一天开始,第\(i\)天可以使\(i\)位置上的数\(+1\),当\(i=n\)时,下次从\(i=1\)再开始,另外,在每天结束时,你可以使任意一个位置上的数\ ...

  2. 牛客网 牛客练习赛4 A.Laptop-二维偏序+离散化+树状数组

    A.Laptop 链接:https://ac.nowcoder.com/acm/contest/16/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其 ...

  3. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  4. 牛客练习赛63 牛牛的树行棋 差分 树上博弈 sg函数

    LINK:牛牛的树行棋 本来是不打算写题解的. 不过具体思考 还是有一段时间的. 看完题 一直想转换到阶梯NIM的模型上 转换失败. 考虑SG函数. 容易发现 SG函数\(sg_x=max{sg_{t ...

  5. 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP

    LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...

  6. 牛客练习赛53 (E 老瞎眼 pk 小鲜肉) 线段树+离线

    考试的时候切的,类似HH的项链~ code: #include <bits/stdc++.h> #define ll long long #define M 500003 #define ...

  7. 牛客NOIP提高组R1 C保护(主席树)

    题意 题目链接 Sol Orz lyq 我们可以把一支军队(u, v)拆分为两个(u, lca)和(v, lca) 考虑一个点x,什么时候军队对它有贡献,肯定是u或v在他的子树内,且lca在他的子树外 ...

  8. 牛课练习赛34 Flittle w and Discretization 主席树维护Mex

    ittle w and Discretization 主席树维护Mex. 每个右端点 r 维护出一棵 在[1, r ] 区间中 其他所有的 值离这个 r 最近的的位置是多少. 然后询问区间[L,R]的 ...

  9. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

随机推荐

  1. 一文说清 KubeSphere 容器平台的价值

    KubeSphere 作为云原生家族 后起之秀,开源近两年的时间以来收获了诸多用户与开发者的认可.本文通过大白话从零诠释 KubeSphere 的定位与价值,以及不同团队为什么会选择 KubeSphe ...

  2. Nmap常见扫描方式流量分析

    环境说明 扫描者:manjaro linux , IP地址:192.168.31.160 被扫描者:centos 7,IP地址:192.168.31.175 分析工具:wireshark nmap 版 ...

  3. Centos 6.4最小化安装后的优化(1)

    一.更新yum官方源 Centos 6.4系统自带的更新源速度比较慢,相比各位都有所感受,国内的速度慢的让人受不了.为了让centos6.4系统使用速度更快的yum更新源,一般都会选择更换源,详细步骤 ...

  4. Mysql基础(九):MySQL 事务

    一.含义事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行二.特点(ACID)A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行C 一致性:一个事务可以使数据 ...

  5. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  6. 移除hmtl5 input type=“number”的step验证

    设置 step="any"例如:<input type="number" step="any" value=""& ...

  7. ffmpeg源码编译环境搭建

    ffmpeg是视频开发最常用到的开源软件,FFmpeg功能强大,用途广泛,提供几乎所有你能够想到的与视频开发相关的操作,许多商业软件都以ffmpeg为基础进行开发定制. FFmpeg: FFmpeg ...

  8. Python 如何生成 200 个激活码

    请用 Python 如何生成 200 个激活码. 激活码的格式为asqE-9xRK-lqWU-QkMT 要求1: 使用随机生成时,生成数字概率为1/5,大写字母和小写字母概率各为2/5 要求2: 这2 ...

  9. 【Python学习笔记二】开始学习啦!如何在IDEA中新建python文件

    1.新建module   2.选择本地安装的python   3.右键新建的module,创建python file就可以开始编程了   4.有时候回出现无法识别python内建函数的问题,就是运行没 ...

  10. 《2020版Linux云计算学习图谱》帮你提升80%专业技能,在线免费领

    2亿人在家办公.视频会议的需求,给钉钉后台系统带来巨大压力.据了解,钉钉在通过阿里云紧急扩容1万台服务器后,再度扩容1万台云服务器. 受疫情影响,在家办公需求暴涨.从29号开始到2月6日,腾讯会议每天 ...