莫隊新科技——二次離線莫隊入門

2021-03-02 ACM算法日常

緣起

掌握莫隊核心科技,來入坑一下二次離線莫隊~ 本文的例題是 洛谷 P4887 模板 莫隊二次離線(第十四分塊(前體))

分析
珂朵莉給了你一個序列a,每次查詢給一個區間 [l,r]
查詢 l<=i<j<=r, 且ai xor aj 的二進位表示下有k個比特位1的二元組 (i,j) 的個數

輸入
第一行三個數表示n,m,k
第二行n個數表示序列a
之後m行,每行兩個數l,r表示一次查詢

輸出
輸出m行,每行一個數表示查詢的結果

輸入樣例
5 5 2
3 4 8 0 2
4 5
3 5
1 4
2 5
1 5

輸出樣例
0
1
2
3
4

1≤n,m≤1e5,0≤ai,k<16384

首先,二次離線莫隊的前置技能是 【1】《優雅的暴力——莫隊算法》

二次離線莫隊是一個新的科技,由 神仙 lxl 2018年 大力YY出的技巧,可以處理的問題一般長下面的樣子

一個序列a,m次詢問,每次詢問a[l,...,r]中有多少對(x,y)(l<=x<y<=r)滿足某條件

而在這道題中,所謂的某條件也就是x xor y的二進位表示下有k個比特位1

其實更一般的,  二次離線莫隊基於 莫隊+掃描線 思想, 適用於滿足以下條件的題目

add/sub 的時間不是O(1)或者說即便是O(1)但是常數巨大, 更確切講, 莫隊四句中擴展或者刪除一個點對答案的影響取決於當前區間的長度.第2條中的一個點對答案的影響可用前綴寫成差分的形式.

二次離線莫隊依舊是莫隊嘛,所以肯定先要按莫隊的套路來,我們先不考慮什麼二次離線莫隊,先用不帶修莫隊來切.

為了方便講解,我們設輸入的那個序列為a[1]~a[n],  因為是不帶修的莫隊, 所以每次只需要考慮add、sub函數怎麼寫就行了.

add(i) 是加入一個點i 之後對res的影響, 而i假設當前區間是 [l, r], 則加入i = r + 1(即右端點右移動) 或者 加入i = r-1(即左端點左移動), 則導致對res的影響是

所以我們要能快速求出上式右邊集合的大小即可. 而這只需要考慮集合

即可, 然後(1)式的右邊就等於

其中 num[i], 0<=i<16384 是 i 這個值出現的次數.  即

就是這次移動帶來res的變動值(下文稱這種變動值為a[i]對區間[l, r]的貢獻).  這是add的分析, sub是同理的.

下面考慮一下這種裸的不帶修莫隊的做法的複雜度. 顯然,add、sub的複雜度依舊是O(1)的,只是常數有點大——常數是

作死嘗試一把,體驗騙分的快感

//#include "stdafx.h"
//#define LOCAL
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
#define int long long
#define re register int
#define FE(cur) for(re h = head[cur], to; ~h; h = g[h].nxt)
#define ilv inline void
#define ili inline int
#define ilc inline char
#define SQUARE(x) ((x) * (x))
namespace fastio
{
    const int BUF = 1 << 21;
    char fr[BUF], fw[BUF], *pr1 = fr, *pr2 = fr;int pw;
    ilc gc() { return pr1 == pr2 && (pr2 = (pr1 = fr) + fread(fr, 1, BUF, stdin), pr1 == pr2) ? EOF : *pr1++; }
    ilv flush() { fwrite(fw, 1, pw, stdout); pw = 0; }
    ilv pc(char c) { if (pw >= BUF) flush(); fw[pw++] = c; }
    ilv read(int &x)
    {
        x = 0; int f = 1; char c = gc();
        while(!isdigit(c)) { if (c == '-') f = -1; c = gc(); }
        while(isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = gc();
        x *= f;
    }
    ilv write(int x) { if (x < 0) pc('-'), x = -x; if (x > 9) write(x / 10); pc(x % 10 + 48); }
    ilv writeln(int x) { write(x);pc(10); }
    ilv read(char *x)
    {
        char c = gc();
        while(!isalpha(c)) c = gc();
        while (isalpha(c)) *x++ = c, c = gc();
        *x = 0;
    }
    ilv write(char *x) { while(*x) pc(*x++); }
    ilv writeln(char *x) { write(x); pc(10); }
} using namespace fastio;
const int maxn = 1e5+5, FULL = (1 << 14);
int n, m, k, a[maxn], bel[maxn], B, ans[maxn], l = 1, r, num[FULL], kbit[3500], tot, res;
struct Q
{
    int l, r, id;
    bool operator <(const Q &rhs) const
    {
        return bel[l] == bel[rhs.l] ? r < rhs.r : bel[l] < bel[rhs.l];
    }
} qs[maxn];

ili popcnt(int i)
{
    int ans = 0;
    while(i)
    {
        ans += i & 1;
        i >>= 1;
    }
    return ans;
}

ilv add(int i) // O(3432)的操作
{
    for (re j = 1; j <= tot; j++)
    {
        res += num[a[i] ^ kbit[j]];
    }
    ++num[a[i]];
}

ilv sub(int i)
{
    --num[a[i]];
    for (re j = 1; j <= tot; j++)
    {
        res -= num[a[i] ^ kbit[j]];
    }
}

signed main()
{
#ifdef LOCAL
    freopen("d:\\data.in", "r", stdin);
    //freopen("d:\\my.out", "w", stdout);
#endif
    read(n), read(m), read(k); B = sqrt(1.0 * n);
    for (re i = 0; i < FULL; i++)
    {
        if (popcnt(i) == k)
        {
            kbit[++tot] = i;
        }
    }
    for (re i = 1; i <= n; i++)
    {
        read(a[i]);
        bel[i] = (i - 1) / B + 1;
    }
    for (re i = 1; i <= m; i++)
    {
        read(qs[i].l), read(qs[i].r), qs[i].id = i;
    }
    sort(qs + 1, qs + m + 1);
    for (re i = 1; i <= m; i++)
    {
        while(qs[i].l < l)
        {
            add(--l);
        }
        while(qs[i].l > l)
        {
            sub(l++);
        }
        while(qs[i].r < r)
        {
            sub(r--);
        }
        while(qs[i].r > r)
        {
            add(++r);
        }
        ans[qs[i].id] = res;
    }
    for (re i = 1; i <= m; i++)
    {
        writeln(ans[i]);
    }
    flush();
    return 0;
}

ac情況(應該不會wa,僅僅是慢~)

所以我們應該怎麼補完上面的算法呢? 或者說考慮一下上面的代碼耗時在哪裡?  其實我們考慮一下樸素莫隊的移動過程, 注意,我們指的詢問區間是按照52行規則排序之後的區間(下面不再重複聲明這一點). 而從前一個區間移動移動到後一個區間造成的res的變動值不就是左端點的移動和右端點的移動造成的嗎?

將(1)式右側用前綴寫為差分形式(此處可以回憶一下我們說的二次離線莫隊的適用範圍)

上面的(3)式是以右端點右移動舉例的. 其中

但是因為題目強調自己不能和自己異或(例如k=0, 即含有0個比特位1,則自己和自己異或也是得到0),所以上面的式子變為

即我們從一個區間移動到另一個區間,其實四句while就在以在線的方式幹下面的事情.

即一個數對一段區間的貢獻.

那為什麼我們不將對同一個前綴做的貢獻開vector收集起來然後一口氣計算這些貢獻?  因為很有可能同一段前綴a[1,..,i],我們要計算不同的數,例如x, y對該前綴的貢獻,按照上面被T掉的做法,其實是x和y分別各自跑了一次O(3432)的程序, 而其實如果我們事先知道了要處理 x, y 對 前綴a[1,..,i]的貢獻的話,我們大可以放在一起處理,這樣就大大節省了時間.  因為我們假設已經知道了 前綴a[1,..,i]的分布狀態(即當前前綴為a[1,..,i]的時候num數組的樣子),那麼我們完全可以再維護一個數組 t, 其中 t[z, 0<=z<16384]表示當前前綴a[1,..,i]中與z異或之後恰好有k個比特位1的元素的個數. 那麼對於x,y對當前前綴a[1,..,i]的貢獻不就恰好就是 t[x]、 t[y] 了麼? 這樣就能一口氣處理而不必次次跑 add、sub這種自帶3432超大常數的O(1)程序了.  注意,維護t[z]數組這種做法的思想其實就是掃描線的思想——不斷的加入點(本題沒有點離開,因為前綴是不斷的擴展的),然後維護答案.

縱觀這個處理方法,不就是將跑不帶修莫隊過程中會遇到的所有8種貢獻再次離線出來嗎? 因為這是再一次離線(莫隊本身有一次離線),所以這個算法才叫做二次離線莫隊.

於是我們將(4)、(5)、(6)、(7) 涉及到的8種需要處理的貢獻離線出來.

其中 {a[x], j,  i} 指的是 a[x] 對 前綴a[1,..,j]的貢獻, 而且這種貢獻是要加(i > 0)或者減(i < 0)在第 abs(i) 個詢問上的。

具體離線方法就是模擬跑莫隊,但是並不實質性的進行add/sub,  對每個前綴a[1,..,j] 開一個vector, 實質上做的事情是往這些vector中裝二元組 {x, i}(表示a[x]對前綴a[1,..,j]的貢獻要加(i>0)或者減(i<0)在第|i|個詢問上).

離線完畢,就要開始離線計算這些貢獻的值,秉著離線的精神,我們對考察的當前前綴就要一口氣計算出所有處在它開的vector中的二元組(即一個待計算的貢獻)的答案.  然後加到相應的qs中去.

為了一口氣計算能夠快速, 期間維護一個數組 t, 然後按照 i從1到n考慮當前前綴a[1,..,i](其實就是不斷的往當前前綴中加入a[i], 1<=i<=n), 然後t[z]就像上面說的那樣,維護著當前前綴a[1,..,i]中和z異或之後恰好有k個1的數的個數.  在我們遍歷考察當前前綴的時候, 順帶O(3432)維護一下t即可.

注意,此時我們計算出的只是從一個詢問區間到另一個詢問區間的變化值(即若干貢獻的總和),這其實就是詢問區間答案的差分數組, 所以最後還要做一次差分數組到原數組的還原操作(其實就是做一次前綴和)就得到答案了.

複雜度從之前的

其中 3432n 是維護t數組的複雜度, 這構成了第一部分的複雜度, 因為t數組的存在, 所以我們可以O(1)(常數是1)時間得到各個貢獻的值, 而一共是

空間複雜度由於要存儲

emmm... 應該可以過了~

於是,我天真的寫了第二版的代碼

//#include "stdafx.h"
//#define LOCAL
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
#define int long long
#define re register int
#define FE(cur) for(re h = head[cur], to; ~h; h = g[h].nxt)
#define ilv inline void
#define ili inline int
#define ilc inline char
#define SQUARE(x) ((x) * (x))
typedef pair<int, int> P;
namespace fastio
{
    const int BUF = 1 << 21;
    char fr[BUF], fw[BUF], *pr1 = fr, *pr2 = fr;int pw;
    ilc gc() { return pr1 == pr2 && (pr2 = (pr1 = fr) + fread(fr, 1, BUF, stdin), pr1 == pr2) ? EOF : *pr1++; }
    ilv flush() { fwrite(fw, 1, pw, stdout); pw = 0; }
    ilv pc(char c) { if (pw >= BUF) flush(); fw[pw++] = c; }
    ilv read(int &x)
    {
        x = 0; int f = 1; char c = gc();
        while(!isdigit(c)) { if (c == '-') f = -1; c = gc(); }
        while(isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = gc();
        x *= f;
    }
    ilv write(int x) { if (x < 0) pc('-'), x = -x; if (x > 9) write(x / 10); pc(x % 10 + 48); }
    ilv writeln(int x) { write(x);pc(10); }
    ilv read(char *x)
    {
        char c = gc();
        while(!isalpha(c)) c = gc();
        while (isalpha(c)) *x++ = c, c = gc();
        *x = 0;
    }
    ilv write(char *x) { while(*x) pc(*x++); }
    ilv writeln(char *x) { write(x); pc(10); }
} using namespace fastio;
const int maxn = 1e5+5, FULL = 1 << 14;
int n, m, k, ans[maxn], B, bel[maxn], a[maxn], l = 1, r, kbit[3500], tot, t[FULL]; // t[z] 是當前前綴中和z異或恰好有k個比特位1的元素的個數
struct Q
{
    int l, r, id, ans;
    bool operator <(const Q &rhs) const
    {
        return bel[l] == bel[rhs.l] ? r < rhs.r : bel[l] < bel[rhs.l];
    }
} qs[maxn];
vector<P> ts[maxn];

ili popcnt(int i)
{
    int ans = 0;
    while(i)
    {
        ans += i & 1;
        i >>= 1;
    }
    return ans;
}

ilv init()
{
    for (re i = 0; i < FULL; i++)
    {
        if (popcnt(i) == k)
        {
            kbit[++tot] = i;
        }
    }
}

ilv kk(int x)
{
    for (re i = 1; i <= tot; i++)
    {
        ++t[x ^ kbit[i]];
    }
}

signed main()
{
#ifdef LOCAL
    freopen("d:\\data.in", "r", stdin);
    //freopen("d:\\my.out", "w", stdout);
#endif
    read(n), read(m), read(k); B = sqrt(1.0 * n);
    init();
    for (re i = 1; i <= n; i++)
    {
        read(a[i]), bel[i] = (i - 1) / B + 1;
    }
    for (re i = 1; i <= m; i++)
    {
        read(qs[i].l), read(qs[i].r), qs[i].id = i;
    }
    sort(qs + 1, qs + m + 1);
    for (re i = 1; i <= m; i++) // 模擬跑莫隊, 離線所有貢獻
    {
        while(qs[i].l < l)
        {
            if (r > 0)
            {
                ts[r].push_back(P(l - 1, i));
            }
            if (l > 2)
            {
                ts[l - 2].push_back(P(l - 1, -i));
            }
            --l;
        }
        while(qs[i].l > l)
        {
            if (r > 0)
            {
                ts[r].push_back(P(l, -i));
            }
            if (l > 1)
            {
                ts[l - 1].push_back(P(l, i));
            }
            ++l;
        }
        while(qs[i].r < r)
        {
            if (r > 1)
            {
                ts[r - 1].push_back(P(r, -i));
            }
            if (l > 1)
            {
                ts[l - 1].push_back(P(r, i));
            }
            --r;
        }
        while(qs[i].r > r)
        {
            if (r > 0)
            {
                ts[r].push_back(P(r + 1, i));
            }
            if (l > 1)
            {
                ts[l - 1].push_back(P(r + 1, -i));
            }
            ++r;
        }
    }
    for (re i = 1; i <= n; i++)
    {
        kk(a[i]); // O(3432) 維護t
        for (re j = 0, len = ts[i].size(), x, y, gx; j < len; j++) // O(sqrt{n})計算貢獻
        {
            x = ts[i][j].first, y = ts[i][j].second; // 第|y|個詢問, a[x]對當前前綴的貢獻
            gx = t[a[x]];  // a[x]對第|y|個詢問作用在當前前綴上的貢獻值
            if (!k && x <= i) // 如果題目中k=0, 且x <= i, 則因為一個數和自己異或得到的也是0, 但是題目要求不能將自己和自己的異或計入答案, 所以要去掉這種情況(因為x<=i, 所以x被計入答案了)
            {
                --gx;
            }
            if (y < 0)
            {
                qs[-y].ans -= gx;
            }
            else
            {
                qs[y].ans += gx;
            }
        } 
    } // 離線計算所有貢獻
    for (re i = 1; i <= m; i++) // 差分還原
    {
        qs[i].ans += qs[i - 1].ans;
    }
    for (re i = 1; i <= m; i++)
    {
        ans[qs[i].id] = qs[i].ans;
    }
    for (re i = 1; i <= m; i++)
    {
        writeln(ans[i]);
    }
    flush();
    return 0;
}

ac情況

顯然,我們最後的任務是優化空間複雜度.

其實上一版代碼耗費

第一類 a[x+1] 對 前綴a[1,..,x]的貢獻,其中 x 會變化第二類 a[l,..,r] 中所有數對 前綴a[1,..,x] 的貢獻, 其中在一次端點的移動中,x是不會變化的.

要注意這個不會變化, 所以我們完全可以將上面兩類貢獻分開來計算. 其中第二類貢獻可以記做 (l, r, x, i或者-i), 也就是只需要標記端點移動的起止即可,而上一份代碼我們是怎麼存的?

(l, x, i或者-i);
(l + 1, x, i或者-i);
...
...
(r - 1, x, i或者-i);
(r, x, i或者-i);

耗費了 O(r - l) 的空間存儲了這些離線的貢獻!!!即原本只需要一個 (l, r, x, i 或者-i) 就能記錄的離線貢獻竟然花費了O(r - l) 的空間存儲, 那不MLE才怪呢!!!

所以我們就知道該如何改進上面的代碼了,而且空間複雜度被優化為O(m)的了, 這就完全可以接受了

最後一擊~ (ง •̀_•́)ง

//#include "stdafx.h"
//#define LOCAL
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
#define int long long
#define re register int
#define FE(cur) for(re h = head[cur], to; ~h; h = g[h].nxt)
#define ilv inline void
#define ili inline int
#define ilc inline char
#define SQUARE(x) ((x) * (x))
typedef pair<int, int> P;
namespace fastio
{
    const int BUF = 1 << 21;
    char fr[BUF], fw[BUF], *pr1 = fr, *pr2 = fr;int pw;
    ilc gc() { return pr1 == pr2 && (pr2 = (pr1 = fr) + fread(fr, 1, BUF, stdin), pr1 == pr2) ? EOF : *pr1++; }
    ilv flush() { fwrite(fw, 1, pw, stdout); pw = 0; }
    ilv pc(char c) { if (pw >= BUF) flush(); fw[pw++] = c; }
    ilv read(int &x)
    {
        x = 0; int f = 1; char c = gc();
        while(!isdigit(c)) { if (c == '-') f = -1; c = gc(); }
        while(isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = gc();
        x *= f;
    }
    ilv write(int x) { if (x < 0) pc('-'), x = -x; if (x > 9) write(x / 10); pc(x % 10 + 48); }
    ilv writeln(int x) { write(x);pc(10); }
    ilv read(char *x)
    {
        char c = gc();
        while(!isalpha(c)) c = gc();
        while (isalpha(c)) *x++ = c, c = gc();
        *x = 0;
    }
    ilv write(char *x) { while(*x) pc(*x++); }
    ilv writeln(char *x) { write(x); pc(10); }
} using namespace fastio;
const int maxn = 1e5+5, FULL = 1 << 14;
int n, m, k, ans[maxn], B, bel[maxn], a[maxn], l = 1, r, kbit[3500], tot, t[FULL], pref[maxn]; // pref[i] 是 a[i] 對前綴a[1,..,i-1] 的貢獻
struct Q
{
    int l, r, id, ans;
    bool operator <(const Q &rhs) const
    {
        return bel[l] == bel[rhs.l] ? r < rhs.r : bel[l] < bel[rhs.l];
    }
} qs[maxn];
struct T
{
    int l, r, i; // 意義是a[l,...,r] 對 某前綴(到底是哪個前綴要看它在哪個vector中)做貢獻, 而且這部分貢獻是要加在(i>0)(或減去i<0)貢獻 |i| 上的.
    T(int l, int r, int i):l(l), r(r), i(i){}
};
vector<T> ts[maxn];

ili popcnt(int i)
{
    int ans = 0;
    while(i)
    {
        ans += i & 1;
        i >>= 1;
    }
    return ans;
}

ilv init()
{
    for (re i = 0; i < FULL; i++)
    {
        if (popcnt(i) == k)
        {
            kbit[++tot] = i;
        }
    }
}

ilv kk(int x)
{
    for (re i = 1; i <= tot; i++)
    {
        ++t[x ^ kbit[i]];
    }
}

signed main()
{
#ifdef LOCAL
    freopen("d:\\data.in", "r", stdin);
    //freopen("d:\\my.out", "w", stdout);
#endif
    read(n), read(m), read(k); B = sqrt(1.0 * n);
    init();
    for (re i = 1; i <= n; i++)
    {
        read(a[i]), bel[i] = (i - 1) / B + 1;
    }
    for (re i = 1; i <= m; i++)
    {
        read(qs[i].l), read(qs[i].r), qs[i].id = i;
    }
    sort(qs + 1, qs + m + 1);
    for (re i = 1; i < n; i++)
    {
        kk(a[i]);
        pref[i + 1] = t[a[i + 1]];
    }
    for (re i = 1; i <= m; i++) // 累加第一類貢獻並離線第二類貢獻
    {
        // 左端點左移
        if (qs[i].l < l) // 打標記第二類貢獻(即離線第二類貢獻)
        {
            if (r > 0)
            {
                ts[r].push_back(T(qs[i].l, l - 1, i));
            }
            for (re j = l - 1; j >= qs[i].l; j--)  // 累加第一類貢獻
            {
                qs[i].ans -= pref[j];
            }
            l = qs[i].l;
        }

        // 左端點右移
        if (qs[i].l > l)
        {
            if (r > 0)
            {
                ts[r].push_back(T(l, qs[i].l - 1, -i));
            }
            for (re j = l; j <= qs[i].l - 1; j++)
            {
                qs[i].ans += pref[j];
            }
            l = qs[i].l;
        }
        

        // 右端點左移
        if (qs[i].r < r)
        {
            if (l > 1)
            {
                ts[l - 1].push_back(T(qs[i].r + 1, r, i));
            }
            for (re j = r; j >= qs[i].r + 1; j--)
            {
                qs[i].ans -= pref[j];
            }
            r = qs[i].r;
        }
        

        // 右端點右移
        if (qs[i].r > r)
        {
            if (l > 1)
            {
                ts[l - 1].push_back(T(r + 1, qs[i].r, -i));
            }
            for (re j = r + 1; j <= qs[i].r; j++)
            {
                qs[i].ans += pref[j];
            }
            r = qs[i].r;
        }
        
    }
    memset(t, 0, sizeof(t)); // 因為要重新走一遍前綴
    for (re i = 1; i <= n; i++)
    {
        kk(a[i]); 
        for (re j = 0, len = ts[i].size(), x, y, z, gx; j < len; j++)
        {
            x = ts[i][j].l, y = ts[i][j].r, z = ts[i][j].i; // a[x, y] 對 第|z| 個詢問的第二類貢獻(z >0 則就是加, z <0 就是減)
            for (re p = x; p <= y; p++)
            {
                gx = t[a[p]];  
                if (!k && p <= i)
                {
                    --gx;
                }
                if (z < 0)
                {
                    qs[-z].ans -= gx;
                }
                else
                {
                    qs[z].ans += gx;
                }
            }
        } 
    }
    for (re i = 1; i <= m; i++)
    {
        qs[i].ans += qs[i - 1].ans;
    }
    for (re i = 1; i <= m; i++)
    {
        ans[qs[i].id] = qs[i].ans;
    }
    for (re i = 1; i <= m; i++)
    {
        writeln(ans[i]);
    }
    flush();
    return 0;
}

ac情況

所屬題目
P4887 【模板】莫隊二次離線(第十四分塊(前體))
評測狀態
Accepted
評測分數
100
程式語言
C++
代碼長度
4.24KB
用時
949ms
內存
19.34MB

參考

[1]《優雅的暴力——莫隊算法》

相關焦點

  • 【評測】常用機器人離線編程軟體技術
    通常來講,機器人編程可分為示教在線編程和離線編程兩種。示教編程一般用於入門級應用,如搬運、點焊等,對於複雜應用,示教編程在實際應用中主要存在以下問題:  1、示教在線編程過程繁瑣、效率低。  2、精度完全是靠示教者的目測決定,而且對於複雜的路徑示教在線編程難以取得令人滿意的效果。  基於對示教編程出現的弊端,那麼離線編程就出現啦!
  • 《不思議迷宮》新科技外域法則研究效果一覽
    不思議迷宮將在近期開啟新的科技系統外域法則,那麼外域法則包含了哪些新科技,它們的效果是什麼樣的,又需要消耗什麼材料呢?接下來就讓我們一起了解一下吧。不思議迷宮將在近期開啟新的科技系統外域法則,那麼外域法則包含了哪些新科技,它們的效果是什麼樣的,又需要消耗什麼材料呢?接下來就讓我們一起了解一下吧。
  • 盤點訊飛入門級消費者產品
    其實想用上A.I.產品也不必大出血,科大訊飛幾款入門級的A.I.產品性價比就很高,尤其適合新手。今天我們就來盤點一下那些訊飛入門級消費者產品。  二、學生也買的起的錄音筆A1官方價¥399  科大訊飛在智能語音領域有著二十一年的深耕經驗,那麼以智能語音為核心技術的錄音筆就必須來一款了。
  • 從YARN遷移到k8s,滴滴機器學習平臺二次開發是這樣做的
    在2019 AI開發者大會上,滴滴出行資深軟體工程師唐博在機器學習技術分論壇上分享了kubernetes調度系統在滴滴在機器學習平臺中的落地與二次開發。本次演講從滴滴機器學習平臺的特點開始探討,分享了滴滴機器學習場景下的 k8s 落地實踐與二次開發的技術實踐與經驗,包括平臺穩定性、易用性、利用率、平臺 k8s 版本升級與二次開發等內容。此外,唐博還介紹了滴滴機器學習平臺是如何從 YARN 遷移到 k8s,以及 YARN 的二次開發與 k8s 的對比等。
  • 有道詞典怎麼下載離線包 離線翻譯功能上線
    有道詞典就是款非常有名的翻譯軟體,他是網易旗下的翻譯產品,能夠針對不同用戶的需求提供在線翻譯、人工翻譯、離線翻譯等功能!今天小編就為大家介紹離線翻譯的方法,還不知道怎麼離線翻譯的小夥伴們看過來了!  1、首先,離線翻譯就是在沒有聯網的情況下照樣能夠行駛翻譯功能,這就需要本地電腦裡面有一個離線的翻譯包了!只有擁有了離線翻譯包才能正常使用離線翻譯功能!
  • 《不休的烏拉拉》新手怎麼玩 新手入門攻略
    下就讓小編來給大家介紹一下關於不休的烏拉拉新手入門玩法的相關內容,一起過來看看吧!希望對你有幫助! 不休的烏拉拉新手怎麼玩 一、基本操作,需要挑戰boss才能推進關卡。 二、快速戰鬥角色自身每天可以使用1次免費+9次消費,每個角色可以享受4次免費+36次消費(包括自身的),凌晨5點刷新CD。
  • 航新科技:2019年股票期權激勵計劃部分期權註銷完成
    航新科技:2019年股票期權激勵計劃部分期權註銷完成 時間:2020年12月11日 16:20:44&nbsp中財網 原標題:航新科技:關於2019年股票期權激勵計劃部分期權註銷完成的公告證券代碼:300424 證券簡稱:航新科技 公告編號:2020-142 廣州航新航空科技股份有限公司 關於2019年股票期權激勵計劃部分期權註銷完成的公告 本公司及董事會全體成員保證信息披露內容的真實
  • iphone離線怎麼定位,iphone離線是什麼意思
    我們知道在我們的蘋果手機丟了以後,我們都會去使用查找我的iphone這一項功能,不過如果當我們丟失的手機沒電關機離線時,我們要怎麼去找回它呢,下面我來說下iphone離線怎麼定位,iphone離線是什麼意思。
  • 淺談如何實現HTML5的離線存儲
    關於HTML5離線存儲原理及實現,筆者找到一篇介紹離線緩存的,感覺比之前看到的解釋的更透徹,新的知識點記錄如下:大家都知道Web App是通過瀏覽器來訪問的,所以離線狀態下是無法使用app的。其中web app中的一些資源並不經常改變,不需要每次都向伺服器發送請求。這時應運而生的離線緩存就顯得尤為突出。
  • 七套工業機器人離線編程軟體優缺點介紹
    通常來講,工業機器人編程可分為示教在線編程和離線編程。我們今天講解的重點是離線編程,通過示教在線編程在實際應用中主要存在的問題,來說說工業機器人離線編程軟體的優勢和主流編程軟體的功能、優缺點進行深度解析。
  • ​Matlab入門教程 | 005編程示例:閉區間上二次函數的最值
    上的二次函數上的一般二次函數一般情形中,要區分二次項係數如果你需要對照參考,可以長按下面的二維碼,回覆:eg12b, 獲取一般情形的原始碼:長按上面的二維碼,回覆:003, 領取2.5G Matlab視頻+入門進階電子書!
  • 《無地之主3》怎麼離線玩 離線玩法介紹
    導 讀     無地之主3怎麼離線玩?
  • 首創離線中英自由說,百度輸入法這波真不賴
    但是離線中英語音輸入,是企業家獨家首發。這要得益於百度輸入法的離線中英文語音識別系統。它針對性地採用中英文混合建模技術,創造出一款基於低幀率,低比特的中英文SMLTA模型,而在這其中甚至採用了神經網絡語言模型替代傳統的N元語言模型,與此同時,基於SMLTA的離線中英文語音識別系統還是首個基於注意力的端到端離線語音識別模型的產品部署,高智能的模型大大提高了離線中英文語音識別系統的性能。
  • 空氣淨化新科技PHI技術 未來或取代HEPA
    近日,國內空氣淨化市場上異軍突起,一項名為美國PHI光電離子化淨化技術的空氣淨化新科技走進了大眾視野,無需濾網就能除霾,效果直追過濾式空氣淨化技術HEPA。
  • 《正當防衛4》離線模式怎麼進入 離線模式進入方法分享
    導 讀   正當防衛4離線模式進入方法 離線模式設置教程 發布時間:2020-04-20 10:31 來源:網際網路 作者:旋風     正當防衛4離線模式怎麼進入
  • 115ios更新後不能離線下載 離線下載怎麼消失了
    115ios更新後不能離線下載怎麼辦?為什麼115 網盤 離線下載消失了?當你在 115網盤 進行離線下載時,發現該功能不見了應該怎麼辦呢?小編想要告訴大家的是,115網盤已取消離線下載功能,具體詳情請看本文介紹。
  • 二次函數圖像的幾何性質
    除了一次函數,還有二次函數和反比例函數,其實這三種函數的高寬比都有各自的特點。比如一次函數的高寬比就是解析式裡的k,並且和所取的兩點無關,也就是一次函數上任意兩點的高寬比都為k(k為定值則高寬比為定值)。    今天藉助GGB(GeoGebra從「0」基礎到入門精通教程01-09+實操案例整合版)軟體,探究下二次函數的高寬比是什麼樣的?