GDUT 排位賽題解報告 第5場

2021-10-03 18:16:04 字數 1812 閱讀 9981

chenjr給你乙個長度為n的排列p,你可以交換其中任意相鄰的兩個數。現在你需要用最小的交換次數使得這個排列變成公升序的序列。現在chenjr想知道,對於這個排列p,是否存在唯一的交換方式,使得這個排列變成公升序的序列。

input

第一行包含乙個正整數t (1≤t≤5∗104),代表有t組樣例。

對於每組樣例,第一行包含乙個n (1≤∑n≤105),代表排列的大小。

下一行包含n個正整數pi,代表排列的值。

output

對於每組樣例,輸出一行』y』或者』n』。

如果交換方式唯一,則輸出』y』,否則輸出』n』。

example

inputcopy31

133 2 1

43 1 2 4

outputcopyyn

y這個題意很清楚,我就不多說,就是問決策唯一性。

我們來看一下:當且僅當兩個相鄰數左大右小才可以交換。把這樣的兩個數稱為可操作的數對。

這樣的話,我們就可以想如果初始序列有大於乙個這樣的可操作的數對那麼答案就是n,因為第一步就可以有多個操作。

換句話說:需要始終只有乙個或者0個這樣的可運算元對,保持到0,才算是y,否則都是n。

那麼假如有這樣的數:…ai , aj , ak , al…;

這個序列只有aj , ak是可操作的數對,那操作之後我們不需要再用o(n)做法去掃整個序列就可以直接去判定,ai , ak, aj, al這3個相鄰的對子有幾個可操作的數對就行了。

於是完整**已經很簡單了:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//鬼畜標頭檔案

using namespace std;

const

int inf =

0x3f3f3f3f

;大小const

int mod =

1e9+7;

typedef

unsigned

long

long ull;

typedef

long

long ll;

//鬼畜define

int t;

int n;

int all[

100010];

intmain()

for(

int time=

0;time1;time++)}

if(num>1)

printf

("n\n");

else

if(num==0)

printf

("y\n");

else

int temp=all[location]

; all[location]

=all[location+1]

; all[location+1]

=temp;

if(all[location-1]

>all[location]

&&all[location+1]

>all[location+2]

)else

if(all[location-1]

<=all[location]

&&all[location+1]

<=all[location+2]

)else}}

}return0;

}

GDUT 排位賽題解報告 第5場

chenjr定義乙個長度為n的完美排列為 對於乙個任意的的i,都有a i 1 a i a i 1 給你乙個正整數n,你需要輸出乙個字典序最小的完美排列。input 一行輸入乙個正整數n 1 n 105 output 輸出n個整數,代表答案的排列。example inputcopy 1outputco...

排位賽題解

十進位制轉二進位制,右移 與 運算結合,遍歷每個數字在二進位制下點每一位。include intmain for int i 0 i 4 i for int i 0 i 4 i a i 1 右移除2 printf d d d d n num 0 num 1 num 2 num 3 return0 題...

2020 2 25GDUT寒假訓練排位賽3 A

農夫約翰的奶牛已經厭倦了他每天早上離開牲口棚前要它們自己整理的要求。奶牛他們剛剛完成了量子物理學博士學位,準備加快速度。今天早上,和往常一樣,農夫john的n頭奶牛 1 n 105 編號為1 n,分散在穀倉的n個不同的位置,也編號為1 n,這樣奶牛i就在pi的位置。但今天上午有m個蟲洞 1 m 10...