CF1085G Beautiful Matrix 解題報告 (計數(shù) + 名次樹)


題目大意

鏈接

如果一個 N × N 的矩陣滿足:

  1. 矩陣每行均為 [1, N] 的正整數(shù)的一個排列
  2. 矩陣內(nèi)所有元素與其上方的元素不同

那么這個矩陣便是美麗的疲吸。

現(xiàn)給定一個 N × N 的美麗矩陣,求有多少個 N × N 的美麗矩陣比它小欺殿。(矩陣從上到下按行比較)

題目保證 N 不超過 2000

分析

這個題的切入點在于美麗矩陣的定義粱腻。如果我們把當前行看作待排序的一個序列商膊,上面一行當成排序基準宾濒,則這個問題可以轉(zhuǎn)化成錯位排序問題。但是不同的是仅淑,在排了一部分數(shù)字以后称勋,剩下的部分的排序標準就不那么嚴苛了(即存在一些可行數(shù)沒有禁止位置)。
i 表示序列的長度涯竟, j 表示存在禁止位置的元素個數(shù)赡鲜,則由容斥原理易得:

\boldsymbol{dp_{i, j}=\sum_{k=0}^j {{(-1)^k} {(i-k)!}{{j}\choose{k} }}}\quad\

這個表達式非常優(yōu)美,但是我們需要求 O(N2)dp 值庐船,如果直接計算的話需要 O(N3) 银酬。不能承受】鹬樱考慮到組合遞推關(guān)系:

\boldsymbol{{i\choose{j}} = {{i - 1}\choose{j}} +{{i - 1}\choose{j - 1}}}\quad\

我們猜想 dp[i][j] 可以由 dp[i][j - 1]dp[i - 1][j - 1] 推出揩瞪。果然,我們有:

\boldsymbol{dp_{i, j} = dp_{i, j - 1} - dp_{i - 1, j - 1}}\quad\

現(xiàn)在我們來解決這個問題篓冲。根據(jù)題目的定義李破,兩個矩陣的比較與兩個字符串的比較方式類似,如果 A 矩陣小于 B 矩陣壹将,那么 A 矩陣的任意“前綴”小于等于 B 矩陣的對應(yīng)“前綴”嗤攻。如果兩個矩陣的第一個不相同元素的位置為 (i, j) ,那么對于給定的 B 矩陣瞭恰,這樣的 A 矩陣共有

\boldsymbol{{dp_{n, n}^{n-i}}({way_0} \times {dp_{n - j, n - 2j + cnt + 1}} + {way_1} \times {dp_{n - j, n - 2j + cnt}})}\quad\

其中 way0way1 分別表示有多少種選法使得 A[i][j] < B[i][j] 且是否選取 A[i - 1] 中在 j 位置以前出現(xiàn)過的元素屯曹; cnt 表示 A[i - 1] 的前 j 個元素與 A[i] 的前 (j - 1) 個元素的相同個數(shù)。
如果我們用樹狀數(shù)組或名次樹來滑動地維護 way0way1 惊畏,則均攤時間復(fù)雜度可降為每個位置 O(logN) 恶耽。剪枝以后可以接受。

代碼

總復(fù)雜度為 O(n2log(n))

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, 
tree_order_statistics_node_update>;
typedef long long ll;
typedef pair<int, int> pii;
#define FOR(i, a, b) for (int (i) = (a); (i) <= (b); (i)++)
#define ROF(i, a, b) for (int (i) = (a); (i) >= (b); (i)--)
#define REP(i, n) FOR(i, 0, (n)-1)
#define sqr(x) ((x) * (x))
#define all(x) (x).begin(), (x).end()
#define reset(x, y) memset(x, y, sizeof(x))
#define uni(x) (x).erase(unique(all(x)), (x).end());
#define BUG(x) cerr << #x << " = " << (x) << endl
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define _1 first
#define _2 second

const int maxn = 2123;
const ll MOD = 998244353;

ll fac[maxn], dp[maxn][maxn], ans, D[maxn];
int n, a[maxn][maxn];
pii way[maxn][maxn];

int main() {
    scanf("%d", &n);
    fac[0] = 1;
    FOR(i, 1, n) fac[i] = fac[i - 1] * i % MOD;
    dp[0][0] = 1;
    FOR(i, 1, n) {
        dp[i][0] = fac[i];
        FOR(j, 1, i) {
            dp[i][j] = (dp[i][j - 1] - dp[i - 1][j - 1]) % MOD;
            if (dp[i][j] < 0) dp[i][j] += MOD;
        }
    }
    D[0] = 1;
    FOR(i, 1, n) D[i] = D[i - 1] * dp[n][n] % MOD;
    FOR(i, 1, n) FOR(j, 1, n) scanf("%d", &a[i][j]);
    FOR(i, 1, n) {
        ordered_set<int> s[2];
        FOR(j, 1, n) s[1].insert(j);
        FOR(j, 1, n) {
            way[i][j]._1 = s[0].order_of_key(a[i][j]);
            if (a[i - 1][j] < a[i][j] && s[0].find(a[i - 1][j]) != s[0].end()) 
                way[i][j]._1--;
            way[i][j]._2 = s[1].order_of_key(a[i][j]);
            if (a[i - 1][j] < a[i][j] && s[1].find(a[i - 1][j]) != s[1].end()) 
                way[i][j]._2--;
            s[0].erase(a[i][j]), s[1].erase(a[i][j]);
            if (s[1].find(a[i - 1][j]) != s[1].end()) {
                s[1].erase(a[i - 1][j]);
                s[0].insert(a[i - 1][j]);
            }
        }
    }
    FOR(i, 1, n)
        ans = (ans + way[1][i]._2 * fac[n - i] % MOD * D[n - 1]) % MOD;
    FOR(i, 2, n) {
        unordered_map<int, int> m;
        FOR(j, 1, n) {
            m[a[i - 1][j]]++;
            int cnt = 2 * j - 1 - m.size();
            ans = (ans + way[i][j]._1 * dp[n - j][n - 2 * j + cnt + 1] 
                     % MOD * D[n - i]) % MOD;
            ans = (ans + way[i][j]._2 * dp[n - j][n - 2 * j + cnt] 
                     % MOD * D[n - i]) % MOD;
            m[a[i][j]]++;
        }
    }
    printf("%lld", ans);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颜启,一起剝皮案震驚了整個濱河市偷俭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缰盏,老刑警劉巖涌萤,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異口猜,居然都是意外死亡负溪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門济炎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川抡,“玉大人,你說我怎么就攤上這事须尚⊙碌蹋” “怎么了侍咱?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長密幔。 經(jīng)常有香客問我楔脯,道長,這世上最難降的妖魔是什么胯甩? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任昧廷,我火速辦了婚禮,結(jié)果婚禮上蜡豹,老公的妹妹穿的比我還像新娘麸粮。我一直安慰自己,他們只是感情好镜廉,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布弄诲。 她就那樣靜靜地躺著,像睡著了一般娇唯。 火紅的嫁衣襯著肌膚如雪齐遵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天塔插,我揣著相機與錄音梗摇,去河邊找鬼。 笑死想许,一個胖子當著我的面吹牛伶授,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播流纹,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼糜烹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漱凝?” 一聲冷哼從身側(cè)響起疮蹦,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茸炒,沒想到半個月后愕乎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡壁公,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年感论,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紊册。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡比肄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薪前,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布关斜,位于F島的核電站示括,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痢畜。R本人自食惡果不足惜垛膝,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丁稀。 院中可真熱鬧吼拥,春花似錦、人聲如沸线衫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授账。三九已至枯跑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間白热,已是汗流浹背敛助。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屋确,地道東北人纳击。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像攻臀,于是被迫代替她去往敵國和親焕数。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,333評論 0 2
  • 各校歷年復(fù)試機試試題 清華茵烈、北大百匆、華科試題詳細筆記部分,少筆記部分與少數(shù)leetcode【含個人整理筆記】 一呜投、詳...
    十里江城閱讀 1,180評論 0 1
  • 1.自定義屬性 首先有沒有自定義屬性,比如這里的圓環(huán)的寬度,外圓的顏色,中間文字的大小和顏色都不是寫死的,所以需要...
    zsj1225閱讀 170評論 0 2
  • 另說過年 文/單鴻恩 快過年了加匈。從一進臘月,一些嗅覺靈敏的朋友說已經(jīng)聞到濃濃的年味了仑荐。過了臘月初八一些喝了...
    單鴻恩閱讀 172評論 0 0
  • 親子日記第322篇雕拼,2018年10月9日,星期二粘招,天氣多云轉(zhuǎn)晴 每周周二的晚上都是我們家最忙碌的時候啥寇,主要是因為我...
    海內(nèi)存知己_bd9e閱讀 134評論 0 1