思路:

首先我们注意到,对一个序列按分割点分开以后分别冒泡其实就相当于对整个序列进行冒泡。每一个元素都会对复杂度贡献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的更多相关文章

  1. BZOJ 无数据题集合

    题目 http://www.lydsy.com/JudgeOnline/problem.php?id=1142 http://www.lydsy.com/JudgeOnline/problem.php ...

  2. bzoj 前100题计划

    bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...

  3. BZOJ的思维题

    5085:最大 给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形 的价值. 关键点是要想到把这些值排序 值从小到大考虑,比如说现在最小的值是(x1 ...

  4. BZOJ两水题连发~(BZOJ1854&&BZOJ1191)

    前言:两题都是省选题不过水的惊人,且都可以用二分图最大匹配做哎--- 1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: ...

  5. 没讲明白的水题orz

    有一道解释程序的水题没给非计算机专业的同学讲明白orz,在这里再练一下.. 源代码完全没有缩进真是难以忍受.. p.s.懂递归就不用看了#include <stdio.h> int n = ...

  6. bzoj 5090 组题

    题目大意: 一个数列,求一段长度不少于k的数 使平均值最大 思路: 把所有数列里的数,转换为(i,sum i)的点 然后求一个下凸包,在这个过程中对于长度特殊处理一下,使栈内至少有一段长度大于等于k ...

  7. BZOJ 2683: 简单题

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 379[Submit][Status][Discuss] ...

  8. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  9. bzoj 2510: 弱题 循环矩阵

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 61[Submit][Status][Discuss] De ...

随机推荐

  1. 教你 Shiro 整合 SpringBoot,避开各种坑

    教你 Shiro 整合 SpringBoot,避开各种坑-----https://www.cnblogs.com/HowieYuan/p/9259638.html

  2. ViewService

    ViewService 在分布式系统中,最常见的场景就是主备架构.但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题.本文描述了一种简单的模型用于解决此问题. 背景 ...

  3. 使用ajax传值,后台乱码

    spring mvc,使用ajax传值,后台发现是乱码 解决方法:  后台的方法里加入  request.setCharacterEncoding("UTF-8"); 就行了 我前 ...

  4. hdu3450

    分析:首先要知道有递推公式dp[i] = Sigma(dp[j]),dp[i]表示第i个数结尾的完美子序列的个数,|a[i] - a[j]| <= d,j<i.直接这样做的时间复杂度为n^ ...

  5. 模拟赛 Problem 3 经营与开发(exploit.cpp/c/pas)

    Problem 3 经营与开发(exploit.cpp/c/pas) [题目描述] 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXpl ...

  6. FreeMarker-简单示例

    以下是简单的FreeMarker示例,直接采用模板 + 数据模型 = 输出的方式.示例中是Application的项目,主要用于展示模板输出HTML文件的功能. 示例: 1.引入POM依赖 <! ...

  7. 非常适合新手的jq/zepto源码分析07---ajax的封装

    复习下ajax吧! 1.创建XMLHttpRequest对象 xmlhttp=new XMLHttpRequest(); xmlhttp=new ActiveXObject("Microso ...

  8. jQuery -&gt; 获取/设置HTML或TEXT内容

    jQuery提供了两个API能够直接用来为元素加入内容. html() text() 当中html()是为指定的元素加入html内容 text()是为指定的元素加入文本内容 两者的差别在于,text中 ...

  9. Andriod开发技巧——Fragment的懒载入

    我们在做应用开发的时候.一个Activity里面可能会以viewpager(或其它容器)与多个Fragment来组合使用.而假设每一个fragment都须要去载入数据.或从本地载入.或从网络载入,那么 ...

  10. C#之插入排序

    算法描述 1.假定数组第一位为有序序列,抽出后一位元素与有序序列中元素依次比较: 2.如果有序序列元素大于抽出元素,将该元素向后移位: 3.重复前面步骤依次抽取无序序列中首位元素进行比较,直到所有数值 ...