日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[CSP-S模拟测试]:序列(构造)

發布時間:2023/10/12 编程问答 73 如意码农
生活随笔 收集整理的這篇文章主要介紹了 [CSP-S模拟测试]:序列(构造) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

給定$N,A,B$,構造一個長度為$N$的排列,使得:
$\bullet$排列長度為$N$;
$\bullet$最長上升子序列長度為$A$;
$\bullet$最長下降子序列長度為$B$。
我們有$SPJ$,有解任意給出一組,否則說明無解。


輸入格式

第一行一個整數$T(1\leqslant T\leqslant 10)$,表示數據組數。
接下來$T$行,每行三個正整數$N$、$A$、$B$。


輸出格式

對每組數據:
如果有解,輸出兩行,第一行一個字符串$Yes$,接下來一行$N$個整數,表示排列。
否則,輸出一行一個字符串$No$。


樣例

樣例輸入:

3
4 2 2
4 4 1
4 3 3

樣例輸出:

Yes
3 4 1 2
Yes
1 2 3 4
No


數據范圍與提示

對于全部的測試數據,保證$T\leqslant 10,N\leqslant 10^5,\sum N\leqslant 2\times 10^5
$\bullet$子任務$1$($20$分):$N\leqslant 5$。
$\bullet$子任務$2$($30$分):每組數據均滿足$N=A\times B$。
$\bullet$子任務$3$($20$分):$B\leqslant 2$。
$\bullet$子任務$4$($30$分):無特殊限制。


題解

一看就是一個構造題,先從$N=A\times B$入手,我們可以將序列分成$B$塊,讓這$B$塊內部構成長度為$A$的上升序列,$B$塊相互之間呈下降序列即可。

舉個栗子,當$N=10,A=2,B=5$,我們可以將其構造成:$(9,10),(7,8),(5,6),(3,4),(1,2)$;可以發現,每一個小括號內呈上升,而小括號之間是下降序列。

如果不滿足$N=A\times B$,我們還可以接著用這樣的思想。

最后來考慮$No$的情況,如果$A+B<N-1$,那么顯然不行;如果$A\times B<N$也是不行的。

于是這到題就被解決了。

時間復雜度:$\Theta(N)$。

期望得分:$100$分。

實際得分:$100$分。


代碼時刻

#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int N,A,B;scanf("%d%d%d",&N,&A,&B);
if(N<A+B-1||N>1LL*A*B){puts("No");continue;}
int len=N-B;puts("Yes");
for(int i=1;i<=B;i++)
{
int now=1;
while(now<A&&len){len--;now++;}
for(int j=N-now+1;j<=N;j++)printf("%d ",j);
N-=now;
}puts("");
}
return 0;
}

rp++

總結

以上是生活随笔為你收集整理的[CSP-S模拟测试]:序列(构造)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。