首先 最多有乙個數字同時出現在最長上公升子串行和最長下降子串行中, 所以若 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 有沒有被標記的數。如果沒有,則返回...