求循環(huán)串的最小逆序數(shù) HDUOJ 1394

題目鏈接在此
題意是給定一個(gè)長度n, 再給一個(gè)[0,n-1]的排列, 可以循環(huán)地將第一個(gè)數(shù)放置序列末尾, 問這樣循環(huán)出來的所有序列中, 最小的逆序數(shù)是多少?

思路:

  • 先求得原序列串的逆序數(shù)
  • 對(duì)于在當(dāng)前序列串的第一個(gè)數(shù)字來說,貢獻(xiàn)的逆序數(shù)是第一位后小于自己的數(shù)的數(shù)量即 a[1] - 1
  • 將第一個(gè)數(shù)字放到末端, 原先在第一位貢獻(xiàn)逆序數(shù)量被消除,在末尾貢獻(xiàn)的逆序數(shù)是在末位前大于自己的數(shù)的數(shù)量, 即 n - a[1]

舉個(gè)莉子, 序列3 1 4 5 2中, 3貢獻(xiàn)的逆序數(shù)自然是3 - 1 = 2個(gè)(小于自己又在后面(必然在自己后面)的)
3若到末位, 成1 4 5 2 3, 貢獻(xiàn)的則是5 - 3 = 2個(gè)(大于自己的又在前面(必然在自己前面)的)

綜上所述, 每次循環(huán)施逾,相當(dāng)于當(dāng)前原序列的總逆序數(shù), 設(shè)為cur, 減去消失的逆序數(shù) + 新添加的,得
cur = cur - (a[1] - 1) + (n - a[1])
至于如何求得原序列的逆序數(shù),方法很多,常用的有歸并排序/線段樹/這里使用的樹狀數(shù)組
注意, 如果是樹狀數(shù)組,由于編號(hào)是[1,n] 所以對(duì)于a[i],值域也得是[1,n] 題目是[0,n-1]盒蟆,所以讀取后得++a[i]調(diào)一下

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxN = 5005, inf = 0x3f3f3f3f;
int A[maxN], bit[maxN + 1], N;
void add(int i, int x) { while (i <= N) { bit[i] += x; i += i & -i; } }
int sum(int i) { int ret = 0; while (i) { ret += bit[i]; i -= i & -i; } return ret; }

int main() {
    // freopen("data.in", "r", stdin);
    while (~scanf("%d", &N) && N) {
        memset(bit, 0, sizeof(bit));
        int inv = 0;
        for (int i = 0; i < N; ++i) {
            scanf("%d", &A[i]);
            ++A[i];
            inv += i - sum(A[i]);
            add(A[i], 1);
        }

        int ans = inv, u, v;
        for (int i = 0; i < N; ++i) {
            u = A[i] - 1;
            v = N - A[i];
            inv = inv - u + v;
            ans = min(ans, inv);
        }
        printf("%d\n", ans);
    }
    return 0;
}
附加:

到最后..還是想稍微整理一下,為什么樹狀數(shù)組能求逆序數(shù)?
首先可能得先了解一下什么是樹狀數(shù)組,長什么樣,節(jié)點(diǎn)怎么和數(shù)組下標(biāo)對(duì)應(yīng)起來,這個(gè)這里就不打算說了..樹狀數(shù)組的一般操作:

給定i, 計(jì)算a1 + a2 + a3 + ... an
給定i和x, 執(zhí)行 ai += x

在知道這個(gè)數(shù)據(jù)結(jié)構(gòu)的前提下:
求某個(gè)逆序數(shù),即求在自己前面又大于自己的數(shù)量,那我們只需要:
在當(dāng)前數(shù)字下標(biāo)是j, 值是a[j], 在數(shù)組里做個(gè)小標(biāo)記,比如 bit[a[j]] += 1, 假設(shè)所有數(shù)都這樣處理過,那以后我們要統(tǒng)計(jì)當(dāng)前數(shù)字下有多少個(gè)小于自己的數(shù)字呢? 求個(gè)前n項(xiàng)和就可以了, 那大于自己的數(shù)字呢珊皿?自然就是n - sum(a[j])啦..把每個(gè)數(shù)字的逆序數(shù)一加,得解

到這兒..其實(shí)思想可以再簡(jiǎn)單化一些: 你就想象你有一個(gè)標(biāo)記數(shù)組vis[maxN] = {0} ,每當(dāng)一個(gè)數(shù)字a[j], 出現(xiàn)了就vis[a[j]] = 1, 那你要統(tǒng)計(jì)前面有多少個(gè)小于自己的數(shù)字,相當(dāng)于統(tǒng)計(jì)j前面出現(xiàn)了多少個(gè)1(求前n項(xiàng)和)独令,設(shè)為sum,那么n - sum腌闯,就是當(dāng)前數(shù)字貢獻(xiàn)的逆序數(shù)了。 但是這種方法效率很低,只不過利用了樹狀數(shù)組來加速,思路是一樣的廓脆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末已烤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苛坚,更是在濱河造成了極大的恐慌比被,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泼舱,死亡現(xiàn)場(chǎng)離奇詭異等缀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娇昙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門尺迂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冒掌,你說我怎么就攤上這事噪裕。” “怎么了宋渔?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵州疾,是天一觀的道長。 經(jīng)常有香客問我皇拣,道長严蓖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任氧急,我火速辦了婚禮颗胡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吩坝。我一直安慰自己毒姨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布钉寝。 她就那樣靜靜地躺著弧呐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嵌纲。 梳的紋絲不亂的頭發(fā)上俘枫,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音逮走,去河邊找鬼鸠蚪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茅信。 我是一名探鬼主播盾舌,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蘸鲸!你這毒婦竟也來了妖谴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤棚贾,失蹤者是張志新(化名)和其女友劉穎窖维,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妙痹,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铸史,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怯伊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳轿。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耿芹,靈堂內(nèi)的尸體忽然破棺而出崭篡,到底是詐尸還是另有隱情,我是刑警寧澤吧秕,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布琉闪,位于F島的核電站,受9級(jí)特大地震影響砸彬,放射性物質(zhì)發(fā)生泄漏颠毙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一砂碉、第九天 我趴在偏房一處隱蔽的房頂上張望蛀蜜。 院中可真熱鬧,春花似錦增蹭、人聲如沸滴某。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎奢。三九已至,卻和暖如春饼灿,著一層夾襖步出監(jiān)牢的瞬間椰憋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工赔退, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓硕旗,卻偏偏與公主長得像窗骑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漆枚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355