BZOJ4240 有趣的家庭菜園(貪心 樹狀陣列)

2022-05-20 16:12:59 字數 642 閱讀 3899

顯然相當於使序列變成單峰。給原序列每個數按位置標號,則要求重排後的序列原標號的逆序對數最少。考慮將數從大到小放進新序列,那麼貪心的考慮放在左邊還是右邊即可,因為更小的數一定會在其兩側,與它自身放在哪無關。對於相同的數,一定可以將其安排至之間無逆序對,特判一下。

#include#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define n 300010

intn,tree[n];

long

long ans=0

;struct dataa[n];

bool cmp(const data&a,const data&b)

void add(int k)

int query(int k)

intmain()

cout

}

BZOJ4240 有趣的家庭菜園

給出乙個長度為n的序列,可以將相鄰的數交換位置,要求通過最少交換次數使得這個序列呈左邊段不遞減,右邊段不遞增 樹狀陣列 貪心 將每個數一開始的下標為原本的位置,最後得到的序列的逆序對數就是操作的次數 首先得到的序列肯定是最大的在中間,第二大的在旁邊。那麼就貪心放值,放的時候找左右兩邊能產生逆序對最少...

BZOJ 4240 有趣的家庭菜園

第一道樹狀陣列 用到了貪心的想法 交換的代價就是交換完之後的逆序對數 將所有ioi草從高到低放入 貪心判斷是放在左邊還是放在右邊 會爆int 也要考慮有兩棵ioi草高度相同 include include include include using namespace std const int m...

bzoj 4240 有趣的家庭菜園 樹狀陣列

隨手寫了一發rank1什麼鬼。因為4239有點繁瑣,就先跳過去了。然後看完這道題目就懵逼了。o o 但是仔細想想會發現對於一棵草,它的移動是不會影響到比它更高的草的,因此我們可以從小到大移動草,並且貪心地移動到較小的一邊,換句話說令f i,j,k 表示i j中比k大的數的個數,那麼對於某一棵草 x,...