
51nod 1685 第K大区间2
发布日期:2021-05-06 23:50:37
浏览次数:23
分类:精选文章
本文共 1819 字,大约阅读时间需要 6 分钟。
题意
定义一个长度为奇数的区间的值为其所包含的的元素的中位数。
现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少。题解
这题也想了一会。。
感觉和上一题一样,都是卡在了局部判断,没有反应整体来做,纠结于每个数来做,这样显然是不行的 我们还是考虑二分答案mid 如果我们对于比这个答案大的一个一个做肯定是不行的 我们考虑怎么样的区间是符合条件的 那就是比mid大的数占一半或以上嘛! 我们并不关心她的中位数是什么,我们只关心他的中位数是否比mid大 于是我们得到一个做法 比mid大的标为1,比mid小的标为-1 然后就是问有多少个奇数区间和是大于0的 这个的话,一个比较简单的做法,是对于奇数位和偶数位都开一个树状数组来维护每个前缀和有多少个 但这样虽然可以通过这题,但是你会发现你多了一个log 其实这个log是没有必要的 我们考虑到,每一次,前缀和只会变化1 换句话说,合法变成不合法,或者不合法变成合法的变化每一次只有1 于是我们可以记录两个答案,分别记录奇数位和偶数位的,然后每一次前缀和变化的时候维护一下就可以了 前缀和就同两个桶维护就可以了我比较懒,所以写了树状数组的,因为树状数组常数小,一般都可以通过
时间复杂度:前者 O(nlog2n) O ( n l o g 2 n ) 后者 O(nlogn) O ( n l o g n ) CODE:#include#include #include #include using namespace std;typedef long long LL;const LL N=100005*2;LL n,k;LL a[N];LL b[N];void lsh (){ sort(b+1,b+1+n); b[0]=1; for (LL u=2;u<=n;u++) if (b[b[0]]!=b[u]) b[++b[0]]=b[u]; for (LL u=1;u<=n;u++) { LL l=1,r=b[0]; while (l<=r) { LL mid=(l+r)>>1; if (b[mid]==a[u]) {a[u]=mid;break;} else if (b[mid]>a[u]) r=mid-1; else l=mid+1; } }}LL f[2][N];LL lb (LL x){ return x&(-x);}void change (LL o,LL x){x+=100001;while (x 0) { lalal=lalal+f[o][x]; x-=lb(x); } return lalal;}LL calc (LL x){ memset(f,0,sizeof(f)); LL sum=0; change(0,0); LL lalal=0; for (LL u=1;u<=n;u++) { if (a[u]>=x) sum++; else sum--; lalal=lalal+get(!(u&1),sum); change(u&1,sum); } return lalal;}int main(){ scanf("%lld%lld",&n,&k); for (LL u=1;u<=n;u++) { scanf("%lld",&a[u]);b[u]=a[u];} lsh(); LL l=1,r=b[0],ans; while (l<=r) { LL mid=(l+r)>>1; if (calc(mid)>=k) {l=mid+1;ans=mid;} else r=mid-1; } printf("%lld\n",b[ans]); return 0;}
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月16日 06时28分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2019-03-05
STM8 GPIO模式
2019-03-05
omnet++
2019-03-05
23种设计模式一:单例模式
2019-03-05
Qt中的析构函数
2019-03-05
C语言实现dijkstra(adjacence matrix)
2019-03-05
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
2019-03-05
【单片机开发】智能小车工程(经验总结)
2019-03-05
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
2019-03-05
C++&&STL
2019-03-05
子集(LeetCode 78)
2019-03-05
微信js-sdk使用简述(分享,扫码功能等)
2019-03-05
mxsrvs支持thinkphp3.2伪静态
2019-03-05
c++中ifstream及ofstream超详细说明
2019-03-05
vuex modules
2019-03-05
sleep、wait、yield、join——简介
2019-03-05
web项目配置
2019-03-05
基于单片机简易信号误差分析设计-全套资料
2019-03-05
基于单片机简易脉搏测量仪系统设计-毕设课设资料
2019-03-05
Javascript中String支持使用正则表达式的四种方法
2019-03-05