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=;
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=;i<=n;i++)scanf("%d",&a[i].w),a[i].p=i;
sort(a+,a++n,cmp);
for(int i=;i<n;i++)mx[i]=max(mx[i-],a[i].p),cnt[i]=max(mx[i]-i,);
for(int i=;i<=n;i++)ans+=max(cnt[i],cnt[i-]);
printf("%lld\n",ans);
}
附一个暴力程序
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=,inf=0x3f3f3f3f;
int n,a[N],work_counter,minn[N],maxx[N];
void bubble_sort_pass(int *a,int len){
for(int i=;i<=len-;i++)if(a[i]>a[i+])swap(a[i],a[i+]);
}
int get_partition_points(int *a,int len){
minn[len]=inf;maxx[]=a[];int temp=;
for(int i=len-;~i;i--)minn[i]=min(minn[i+],a[i]);
for(int i=;i<len;i++)maxx[i]=max(maxx[i-],a[i]);
for(int i=;i<len-;i++)if(maxx[i]<=minn[i+])temp++;
return temp;
}
void quickish_sort(int *a,int len){
if(len==)return;
work_counter+=len,bubble_sort_pass(a,len);
minn[len]=inf;maxx[]=a[];int temp=;
for(int i=len-;~i;i--)minn[i]=min(minn[i+],a[i]);
for(int i=;i<len;i++)maxx[i]=max(maxx[i-],a[i]);
vector<int>v;
for(int i=;i<len-;i++)if(maxx[i]<=minn[i+])v.push_back(i);
if(v.empty())return;
quickish_sort(a,v[]+);
for(int i=;i<v.size()-;i++)quickish_sort(a+v[i]+,v[i+]-v[i]);
quickish_sort(a+v[v.size()-]+,len-v[v.size()-]-);
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%d",&a[i]);
quickish_sort(a,n);
printf("%d\n",work_counter);
}
BZOJ 5277 IQ题orz的更多相关文章
- BZOJ 无数据题集合
题目 http://www.lydsy.com/JudgeOnline/problem.php?id=1142 http://www.lydsy.com/JudgeOnline/problem.php ...
- bzoj 前100题计划
bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...
- BZOJ的思维题
5085:最大 给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形 的价值. 关键点是要想到把这些值排序 值从小到大考虑,比如说现在最小的值是(x1 ...
- BZOJ两水题连发~(BZOJ1854&&BZOJ1191)
前言:两题都是省选题不过水的惊人,且都可以用二分图最大匹配做哎--- 1854: [Scoi2010]游戏 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: ...
- 没讲明白的水题orz
有一道解释程序的水题没给非计算机专业的同学讲明白orz,在这里再练一下.. 源代码完全没有缩进真是难以忍受.. p.s.懂递归就不用看了#include <stdio.h> int n = ...
- bzoj 5090 组题
题目大意: 一个数列,求一段长度不少于k的数 使平均值最大 思路: 把所有数列里的数,转换为(i,sum i)的点 然后求一个下凸包,在这个过程中对于长度特殊处理一下,使栈内至少有一段长度大于等于k ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- bzoj 2510: 弱题 循环矩阵
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 124 Solved: 61[Submit][Status][Discuss] De ...
随机推荐
- CCF201703-1 分蛋糕 java(100分)
试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别 ...
- 【3】数据筛选3 - BeautifulSoup4
#目录 1. 开发前准备 2. 不同解析器对比 3. BeautifulSoup4 初始化和节点对象的认识 4. BS4 案例操作:初始化对象文档 5. 节点查 ...
- 3.2.3.7 ERE 运算符的优先级
在 ERE 里运算符的优先级和 BRE 一样.由高至低列出了 ERE 运算符的优先级. 运算符 含义 [..] [= =] [: :] 用于字符对应的方括号符号 \metachar ...
- 在Electron中通过ffi模块实现JavaScript调用C++动态库
目前在网上能搜到的JS调C++动态库的实现有两种,一种是通过开发Node.js addon模块的方式实现调用,这种对于我们已有的代码实现比较复杂,需要大量的开发,因此不适用:另一种是通过FFI模块,F ...
- SQLITE报错database is locked的解决办法
用firedac连接SQLITE数据库,空间tdbedit绑定字段name,如下语句修改其值时报错. procedure TForm1.Button3Click(Sender: TObject);be ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- windows下检測文件改变
这个主要是应用在我前一篇博客里提到的脚本热载入功能. 主要实现的功能检測目录内文件的变化(改变.新增.删除.重命名),当发现改变的时候通知lua又一次载入脚本.基本上就是一个windows api的使 ...
- Solidworks在哪里找到内六角螺钉 内六角螺栓保准件
GB-screws-凹头螺钉-出来了
- struct结构体在c和c++中的差别
非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int n ...
- Android Studio VS Eclipse (还在用Eclipse?你OUT了!)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! 公司派来一个去美国參加完AnDevCon大会的来给我们分享大会上学习的内容. AnDevC ...