bzoj1697 牛排序 置換群

2021-07-26 20:16:27 字數 1110 閱讀 1050

ac通道:

【題解】

將所給值離散之後,就是乙個置換群問題。

初始狀態為離散值,目標狀態為1~n,交換這一行為映**置換,我們把這一置換迴圈分解而得到乙個置換群。

對於群內的每個環,有乙個很貪心的辦法就是每次都讓權值最小的那個元素去和其他的元素交換,

這樣交換的代價為sum-min+(len-1)*min

其中sum為環內所有元素的權重之和,min為環內最小的元素,len為這個環的迴圈節。

經過len-1次交換,我們讓這個環變的有序了。

不過這裡還有乙個策略,引進外援,就是從全域性中找乙個最小的small,將其引入到這個環中,參與置換。

舉例(1) (8 6 9 7) 我們可以先把1和6交換,讓1去參與環的置換,結束後再將6交換進來。

如此的代價為sum+min+(len+1)*small 取這兩種策略裡代價小的那種即可。

#include#include#include#include#include#include#includeusing namespace std;

#define file "read"

#define maxn 100010

#define inf 1000000000

#define up(i,j,n) for(int i=j;i<=n;++i)

#define dn(i,j,n) for(int i=j;i>=n;--i)

namespace init

inline int read()

while(isdigit(ch))

return x*f;

}}using namespace init;

int n,ans,len,minn,a[maxn],b[maxn],v[maxn],vis[maxn],size[maxn],sum[maxn],minn[maxn];

int find(int x)

else l=mid+1;

} return temp;

}void solve(int x)

}int main()

printf("%d\n",ans);

return 0;

}

奶牛排序 RMQ

問題描述 奶牛在熊大媽的帶領下排成了一條直隊。顯然,不同的奶牛身高不一定相同 現在,奶牛們想知道,如果找出一些連續的奶牛,要求最左邊的奶牛 a 是最矮的,最右 邊的 b 是最高的,且 b 高於 a 奶牛,且中間如果存在奶牛,則身高不能和 a b 奶牛相同,問這樣的一些奶牛最多會有多少頭。從左到右給出...

奶牛排序 cow sort 置換群

農夫john準備把他的 n 1 n 10,000 頭牛排隊以便於行動。因為脾氣大的牛有可能會搗亂,john想把牛按脾氣的大小排序。每一頭牛的脾氣都是乙個在1到100,000之間的整數並且沒有兩頭牛的脾氣值相同。在排序過程中,john可以交換任意兩頭牛的位置。因為脾氣大的牛不好移動,john需要x y...

牛客團隊賽2 H 奶牛排序 (群置換)

奶牛排序 時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 農夫john準備把他的 n 1 n 10,000 頭牛排隊以便於行動。因為脾氣大的牛有可能會搗亂,john想把牛按脾氣的大小排序。每一頭牛的脾氣都是乙個在1到...