BZOJ4240 有趣的家庭菜園

2022-05-19 19:57:49 字數 909 閱讀 1155

給出乙個長度為n的序列,可以將相鄰的數交換位置,要求通過最少交換次數使得這個序列呈左邊段不遞減,右邊段不遞增

樹狀陣列+貪心

將每個數一開始的下標為原本的位置,最後得到的序列的逆序對數就是操作的次數

首先得到的序列肯定是最大的在中間,第二大的在旁邊。。

那麼就貪心放值,放的時候找左右兩邊能產生逆序對最少的放就可以了,用樹狀陣列維護逆序對數

注意一下多個值相等的情況,且要加long long

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int a[310000

];int lowbit(int x)

intn;

void change(int x,intd)}

int getsum(int

x)

return

ans;

}struct

node

h[310000

];bool

cmp(node n1,node n2)

intmain()

sort(h+1,h+n+1

,cmp);

ll ans=0

;

for(int i=1;i<=n;)

while(h[j+1].d==h[j].d);

for(;i<=j;i++) change(h[i].id,1

); }

printf(

"%lld\n

",ans);

return0;

}

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,...

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

popoqqq 從小到大列舉高度,由於無論將這株草移動到左側還是右側都對比它高的植物沒有影響,因此貪心選擇代價最小的方向即可 故答案為 min a 1 i 1 中大於a i 的數的數量,a i 1 n 中大於a i 的數的數量 include include includeusing namespa...