码迷,mamicode.com
首页 > 其他好文 > 详细

测试样式

时间:2020-02-16 20:46:55      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:token   pac   序列   log   取整   algorithm   递归   不用   return   

测试

// https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1144

#include "cstdio"

using namespace std;

const int SZ = 1 << 20; //快速io
struct fastio
{
    char inbuf[SZ];
    char outbuf[SZ];
    fastio()
    {
        setvbuf(stdin, inbuf, _IOFBF, SZ);
        setvbuf(stdout, outbuf, _IOFBF, SZ);
    }
} io;

const int maxn = 4e6 + 100;
using ll = long long;
struct node
{
    int x, y;
} a[maxn], b[maxn];
ll count = 0;

// 按照 x 升序排列
void mergeX(int lo, int mi, int hi)
{
    int i = lo, j = mi;
    for (int k = lo; k < hi; k++)
    {
        // 这里用了两个 node 来操作,所以不用复制子序列出来
        if (hi <= j || (i < mi && (a[i].x < a[j].x || (a[i].x == a[j].x && a[i].y < a[j].y))))
            b[k] = a[i++];
        else
            b[k] = a[j++];
    }
    for (int k = lo; k < hi; k++)
        a[k] = b[k];
}

void mergeSortX(int lo, int hi)
{
    if (hi - lo < 2)
        return;
    int mi = (hi + lo) >> 1;
    mergeSortX(lo, mi);
    mergeSortX(mi, hi);
    mergeX(lo, mi, hi);
}

void mergeY(int lo, int mi, int hi)
{
    int i = lo, j = mi;
    for (int k = lo; k < hi; k++)
    {
        // i <  j 则 j 的右侧都更大,个数为 (hi - 1) - (j - 1)
        if (hi <= j || (i < mi && a[i].y < a[j].y))
            b[k] = a[i++], count += hi - j;
        else
            b[k] = a[j++];
    }
    for (int k = lo; k < hi; k++)
        a[k] = b[k];
}

void mergeSortY(int lo, int hi)
{
    if (hi - lo < 2)
        return;
    int mi = (hi + lo) >> 1;
    mergeSortY(lo, mi);
    mergeSortY(mi, hi);
    mergeY(lo, mi, hi);
}

int main()
{
    ll n;
    scanf("%lld", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d", &a[i].x, &a[i].y);
    }
    mergeSortX(0, n);
    mergeSortY(0, n);
    printf("%lld\n", count);
    return 0;
}

\(O\) 时间复杂度

\[ O(1) < O(\log n) < O(n) < O(n \log n) < O(n^2) < O(2^n) < O(n!) \]

技术图片

Big-O Cheat Sheet @Eric Rowell

Big O cheat sheets @cooervo

二分计算中 \(O(\log n)\) 的由来:n 个元素,k 次计算

\[ n \cdot (\frac{1}{2})^{k} = 1 \rightarrow n = 2^k \rightarrow k = \log n \]

典型的复杂度:

算数级数,与末项平方同阶

幂方级数,比幂次高出一阶

几何级数,与末项同阶

调和级数 \(O(\log n)\)

对数级数 \(O(n \log n)\)

理解 Max 2 案例

\(O(2n - 3)\)\(O(n - 1)\)

技术图片

再到 \(O(5n/3 - 2)\)

推导过程简述:

\(T(n) + 2 = 2 * (T(\frac{n}{2}) + 2)\),令 \(G(n) = T(n) + 2\),有

\(G(n) = 2G(\frac{n}{2}) = 4G(\frac{n}{4}) = 8G(\frac{n}{8}) = ...\)

不考虑取整,有 \(G(n) = (\frac{n}{3})G(n/(\frac{n}{3}))=(\frac{n}{3})G(3)\)

递归基为 \(G(2)\)\(G(2)\) ,取较大者,\(G(n)=(\frac{n}{3})G(3)<=\frac{5n}{3}\)

所以有 \(T(n) = G(n)-2 \le \frac 5 3 \cdot n-2\)

推导过程 @yuantailing

时间复杂度 O(log n) 意味着什么?

本章需要学会规范的表述时间复杂度的推导过程

拓展:推导 递归,迭代 求解 Fibonacci sequence 的时间复杂度

递归设计出解,动态规划消除重复计算

测试样式

标签:token   pac   序列   log   取整   algorithm   递归   不用   return   

原文地址:https://www.cnblogs.com/yexuesong/p/12318270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!