BZOJ 5277 IQ题orz
思路:
首先我们注意到,对一个序列按分割点分开以后分别冒泡其实就相当于对整个序列进行冒泡。每一个元素都会对复杂度贡献1,除非一个元素两边的分割点都出现了。因此我们可以完全忽略快排的递归过程。只需考虑每个元素在经历几趟冒泡排序之后两边的分割点都出现了。
考虑一个分割点,不妨就是在i,i+1之间的这个分割点,他在几趟冒泡排序之后会出现呢?出现了这个分割点,说明前i小的元素都已经在前i个了,我们记前i小的元素一开始最大的下标为x,则在x-i趟冒泡之后就会把x挪到前i个位置(因为每趟冒泡一定会使x的下标-1)。也就是说i,i+1之间的分割点会在x-i趟冒泡之后出现。而第i个元素的贡献就是它左右分割点出现时间的最大值。
from https://blog.csdn.net/Icefox_zhx/article/details/80025305
注意如果有相同的数的时候,按照出现的position从小到大排序
(这破题搞了一上午我真是退役选手了)
//By SiriusRen #include <bits/stdc++.h> using namespace std; const int N=100050; int n,mx[N],cnt[N];long long ans; struct Nd{int w,p;}a[N]; bool cmp(Nd a,Nd b){if(a.w!=b.w)return a.w<b.w;return a.p<b.p;} int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i].w),a[i].p=i;sort(a+1,a+1+n,cmp);for(int i=1;i<n;i++)mx[i]=max(mx[i-1],a[i].p),cnt[i]=max(mx[i]-i,1);for(int i=1;i<=n;i++)ans+=max(cnt[i],cnt[i-1]);printf("%lld\n",ans); }
附一个暴力程序
//By SiriusRen #include <bits/stdc++.h> using namespace std; const int N=200050,inf=0x3f3f3f3f; int n,a[N],work_counter,minn[N],maxx[N]; void bubble_sort_pass(int *a,int len){for(int i=0;i<=len-2;i++)if(a[i]>a[i+1])swap(a[i],a[i+1]); } int get_partition_points(int *a,int len){minn[len]=inf;maxx[0]=a[0];int temp=0;for(int i=len-1;~i;i--)minn[i]=min(minn[i+1],a[i]);for(int i=1;i<len;i++)maxx[i]=max(maxx[i-1],a[i]);for(int i=0;i<len-1;i++)if(maxx[i]<=minn[i+1])temp++;return temp; } void quickish_sort(int *a,int len){if(len==1)return;work_counter+=len,bubble_sort_pass(a,len);minn[len]=inf;maxx[0]=a[0];int temp=0;for(int i=len-1;~i;i--)minn[i]=min(minn[i+1],a[i]);for(int i=1;i<len;i++)maxx[i]=max(maxx[i-1],a[i]);vector<int>v;for(int i=0;i<len-1;i++)if(maxx[i]<=minn[i+1])v.push_back(i);if(v.empty())return;quickish_sort(a,v[0]+1);for(int i=0;i<v.size()-1;i++)quickish_sort(a+v[i]+1,v[i+1]-v[i]);quickish_sort(a+v[v.size()-1]+1,len-v[v.size()-1]-1); } int main(){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);quickish_sort(a,n);printf("%d\n",work_counter); }
转载于:https://www.cnblogs.com/SiriusRen/p/9354069.html
BZOJ 5277 IQ题orz相关推荐
- 微软面试IQ题~~(转载)
微软面试IQ题~~(转载) 1.烧一根不均匀的绳子,从头烧到尾总共需要1个小时,问如何用烧绳子的方法来确定半 小时的时间呢? 2.10个海盗抢到了100颗宝石,每一颗都一样大小且价值连城.他们决定这么 ...
- BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2135 是 hydro 的 BZOJ ...
- BZOJ 4066: 简单题
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MB Submit: 2373 Solved: 622 [Submit][Status][Discuss ...
- cdq分治(bzoj 1176: [Balkan2007]Mokia bzoj 2683: 简单题)
CDQ分治: 本质:对询问进行分治 优点:和莫队分块一样都属于技巧,关键时刻能免去复杂的数据结构,常数小 缺点:必须离线 参考:http://blog.csdn.net/hbhcy98/article ...
- 全国大学生英语竞赛培训:听力、词汇语法、完形填空、阅读理解、翻译、改错、IQ题、大小作文、语法等部分快速得分、备战策略和获奖技巧讲解!
目 录 大学生英语竞赛培训--介绍.学习网址 PPT课件.视频--下载 [2020-04-05]P1 如何准备大学生英语竞赛才能拿奖?2:27:54[竞赛简介vs赛前准备] [2020-04-11 ...
- 学界 | DeepMind想用IQ题测试AI的抽象思维能力,进展还不错
来源:大数据文摘 摘要:抽象理解能力一直是人类引以为豪的智慧来源. 阿基米德基于对物体体积的抽象理解,悟到了物体的体积与物体浮力之间的关系.这就是抽象推理的魔力. 基于神经网络的机器学习模型取得了惊人 ...
- bzoj 3687: 简单题
2333,昨天模拟赛第一题死都想不出怎么优化tarjan,然而正解是一个kora***什么什么的东西,就是正反两遍dfs,然后这个算法求强联通分量的话,是可以用bitset来优化一下的(只考虑点). ...
- Bzoj 2683: 简单题(CDQ分治)
2683: 简单题 Time Limit: 50 Sec Memory Limit: 20M. Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两 ...
- 循环矩阵的快速幂(bzoj 2510: 弱题)
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 408 Solved: 218 [Submit][Status][Discuss] ...
- BZOJ 3687 简单题
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1073 Solved: 518 [Submit][Status][Discus ...
最新文章
- 2021-03-20 GPS抽稀之道格拉斯-普克(Douglas-Peuker)算法
- 2-django进阶之日志功能(亲测)
- 面试心得与总结——BAT、网易、蘑菇街
- vue项目实现列表页-详情页返回不刷新,再点其他菜单项返回刷新的需求
- POJ1155 TELE(树形DP)
- kafka的延迟操作-pull操作详解
- idea新建web项目并配置运行教程
- 教你如何创建第一个Java应用程序
- git flow使用
- Java操作数据库(一,JDBC的入门)
- OpenCV-Python官方文档的查看
- Linux 安装kafka的库librdkafka
- 创新工场 DeeCamp 2019 人工智能训练营启动报名,计划招收至少 600 名大学生...
- Diabetes Care:西湖大学郑钜圣等机器学习揭示影响2型糖尿病的肠道菌群特征
- ifox格式如何快速的转换成mp4格式?
- linux安装智能输入法,Ubuntu中文智能拼音输入法配置
- html5 pacs浏览,基于HTML5的PACS--HTML5图像处理
- 新美大--软件测试--《社招、校招jd、公司具体介绍、培训发展、关于实习是什么,要求及常见问题、校招行程、校招常见问题》整理
- nacos配置中心[NACOS HTTP-GET] The maximum number of tolerable server reconnection errors has been reache
- 洛谷——P1617 爱与愁的一千个伤心的理由