序列 構造題

2022-05-20 01:51:55 字數 2005 閱讀 6770

首先 最多有乙個數字同時出現在最長上公升子串行最長下降子串行中, 所以若 a+b

>n+

1a+b

>n+

1, 說明無解.

然後考慮怎麼構造, 將

分成若干個大小為 b

b 的塊(可能會剩下乙個小塊), 總共有 a=⌈

nb⌉a

=⌈bn

​⌉個塊,

最長上公升子串行的長度至少為 a

a, 若 a

<

a, 說明無解.

否則可以在內反轉元素, 每反轉一次最長上公升子串行的長度會增加 1

1,最長下降子串行的長度不變 .

按上述方法構造即可 .將剩

餘部分放

在前面將

剩餘部分

放在前面

#include
#define reg register

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}const

int maxn =

1e5+10;

int n;

int a;

int b;

bool used[maxn]

;void

work()

printf

("yes\n");

int base = n % b;

for(reg int i =

1; i <= a-left; i ++

)int t = n%b;

while

(t <= n)

t += b;

}printf

("\n");

/* if(t >= n + 1)

for(reg int i = 1; i <= b; i ++) printf("%d ", i-1);

*/}int

main()

將剩餘部分放在

後面將剩

餘部分放在後面

#include

#define reg register

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}const

int maxn =

1e6+10;

int n;

int a;

int b;

bool used[maxn]

;void

work()

printf

("yes\n");

for(reg int i =

1; i <= a-left; i ++

)int t = b;

while

(t <= n)

t += b;

}for

(reg int i = n; i >= n-

(n%b)+1

; i --)if

(!used[i]

)printf

("%d "

, i)

;printf

("\n");

}int

main()

72 構造序列

72 構造序列 問題描述 序列是在數學世界中一種非常有趣的數字現象,它通過某一規則來產生數字,使數字變得有趣 變幻無窮。很多數學家對序列這種事物產生了濃厚的興趣,花了很多時間對其進行研究,明明就是其中的一位。一天,他又在研究一種新的序列產生規則,該序列的規則如下 1 第1輪,寫出兩個1,即11 2 ...

排序 構造題

題意 給出一段包含 a t g c 的序列,每個字母可以和左右字母交換位置,每次交換造成乙個消耗,構造出 a t g c 分別連續的序列,求出最小的消耗。解析 首先列舉24種可能,即 a t g c 的排列順序,統計每種可能的消耗。對於求每種情況的消耗,需要乙個類似於求逆序數的思想。假設求atgc的...

構造題訓練

由於noip之前沒有怎麼做過構造,導致吃了大虧。構造 互動 基本問題 有一些數,假設有 n 個,有 m 個被標記,我們可以詢問乙個集合。我們可以得知這個集合內是否存在被標記的數。要求次數 o m log 2n 做法1 分治 考慮分治到當前區間 l,r 詢問 l,r 有沒有被標記的數。如果沒有,則返回...