题目大意
题目描述
你需要构造一个包含整数 1 1 1 到 n n n 的排列(即长度为 n n n 的序列,其中 1 ∼ n 1 \sim n 1 ∼ n 每个数字出现且仅出现一次)。
在这个序列中,我们将数字视为楼房的高度。定义“可见性”规则如下:
从某一侧观察,如果一个数字严格大于它和观察点之间的所有数字,则该数字是可见的(即较高的楼会挡住后面较矮的楼)。
请构造一个排列,同时满足以下两个条件:
从左向右 看,恰好有 a a a 个数字是可见的。
从右向左 看,恰好有 b b b 个数字是可见的。
输入格式
输入包含一行三个整数 n , a , b n, a, b n , a , b 。
数据范围:2 ≤ n ≤ 1000 2 \le n \le 1000 2 ≤ n ≤ 1 0 0 0 ,1 ≤ a , b ≤ n 1 \le a, b \le n 1 ≤ a , b ≤ n 。
输出格式
样例解释
样例 1
输入:5 2 2
输出:yes 1 5 2 3 4
解释:
左侧视角 :看到 1 ,接着看到 5 (5 > 1)。后面的 2, 3, 4 都比 5 小,被 5 挡住。共看见 2 个,满足 a = 2 a=2 a = 2 。
右侧视角 :看到 4 ,3 和 2 被 4 挡住。接着看到 5 (5 > 4)。1 被 5 挡住。共看见 2 个(4 和 5),满足 b = 2 b=2 b = 2 。
样例 2
输入:5 3 4
输出:no
解释:在 n = 5 n=5 n = 5 的情况下,无法构造出左看 3 个、右看 4 个的排列。
样例 4
输入:4 1 4
输出:yes 4 3 2 1
解释:
左侧视角 :第一个是 4 (最大值),挡住了后面所有的数。共看见 1 个,满足 a = 1 a=1 a = 1 。
右侧视角 :从右往左依次是 1, 2, 3, 4,每一个都比右边的前序数字大。共看见 4 个,满足 b = 4 b=4 b = 4 。
思路讲解
这个这道题目还是很简单的。这个无解的情况已经高亮出来了。A 等于等于一,B 等于等于一,肯定是不可能的。因为你一定能够看到一个次高的和一个最高的。所以说你你是不可能你是不可能就是只看到一个建筑的。那么 A 加 B 大于 N 加一的话也是不可能的。因为两边看,从一边看过去,再从另外一边看过去的总和加在一起,不可能超过 N 加一。因为一定有一个最高的建筑会把你给挡住的。所以两边的总和其实就是两边,这边就是,两边它加起来最大就是 N 加一。
后面构造也是比较简单,反正就是要注意这个顺序的,就是要注意一下顺序,就是要注意一下顺序。然后还有最高的建筑一定能被看到这个限制。就是记住这个,然后你用一个 DQ 去构造会简单一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 void Solve () { ll N,a,b; cin >> N >> a >> b; if (a==1 && b==1 ) { cout<<"no\n" ; return ; } if (a+b>N+1 ) { cout<<"no\n" ; return ; } vector<ll> ans_ls (N+2 ) ; deque<ll> q; for (int i=1 ;i<=N-2 ;++i) { q.push_back (i); } if (a==1 ) { ans_ls[1 ]=N; for (ll i=N;i>=2 ;--i) { if (i==N-b+2 ) { ans_ls[i]=N-1 ; }else { ans_ls[i]=q.front (); q.pop_front (); } } }else if (b==1 ){ ans_ls[N]=N; for (int i=1 ;i<=N-1 ;++i) { if (i==a-1 ) { ans_ls[i]=N-1 ; }else { ans_ls[i]=q.front (); q.pop_front (); } } }else { ll cnt=0 ; for (int i=1 ;i<=N;++i) { if (i==a-1 ) { ans_ls[i]=N-1 ; }else if (i==N-b+1 ) { ans_ls[i]=N; }else if (i<a-1 ){ ans_ls[i]=q.front (); q.pop_front (); }else { ans_ls[i]=q.back (); q.pop_back (); } } } cout<<"yes\n" ; for (int i=1 ;i<=N;++i) { cout<<ans_ls[i]<<" " ; } cout<<"\n" ; }
AC代码
AC
https://qoj.ac/submission/2026555
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 #include <bits/stdc++.h> #define all(vec) vec.begin(),vec.end() #define lson(o) (o<<1) #define rson(o) (o<<1|1) #define SZ(a) ((long long) a.size()) #define debug(var) cerr << #var <<" = [" <<var<<"]" <<"\n" ; #define debug1d(a) \ cerr << #a << " = [" ; \ for (int i = 0; i < (int)(a).size(); i++) \ cerr << (i ? ", " : "" ) << a[i]; \ cerr << "]\n" ; #define debug2d(a) \ cerr << #a << " = [\n" ; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [" ; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ cerr << (j ? ", " : "" ) << a[i][j]; \ cerr << "]\n" ; \ } \ cerr << "]\n" ; #define debug3d(a) \ cerr << #a << " = [\n" ; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [\n" ; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ { \ cerr << " [" ; \ for (int k = 0; k < (int)(a[i][j]).size(); k++) \ cerr << (k ? ", " : "" ) << a[i][j][k]; \ cerr << "]\n" ; \ } \ cerr << " ]\n" ; \ } \ cerr << "]\n" ; #define cend cerr<<"\n-----------\n" #define fsp(x) fixed<<setprecision(x) using namespace std;using ll = long long ;using ull = unsigned long long ;using DB = double ;using CD = complex<double >;static constexpr ll MAXN = (ll)1e6 +10 , INF = (1ll <<61 )-1 ;static constexpr ll mod = 998244353 ; static constexpr double eps = 1e-8 ;const double pi = acos (-1.0 );ll lT,testcase; void Solve () { ll N,a,b; cin >> N >> a >> b; if (a==1 && b==1 ) { cout<<"no\n" ; return ; } if (a+b>N+1 ) { cout<<"no\n" ; return ; } vector<ll> ans_ls (N+2 ) ; deque<ll> q; for (int i=1 ;i<=N-2 ;++i) { q.push_back (i); } if (a==1 ) { ans_ls[1 ]=N; for (ll i=N;i>=2 ;--i) { if (i==N-b+2 ) { ans_ls[i]=N-1 ; }else { ans_ls[i]=q.front (); q.pop_front (); } } }else if (b==1 ){ ans_ls[N]=N; for (int i=1 ;i<=N-1 ;++i) { if (i==a-1 ) { ans_ls[i]=N-1 ; }else { ans_ls[i]=q.front (); q.pop_front (); } } }else { ll cnt=0 ; for (int i=1 ;i<=N;++i) { if (i==a-1 ) { ans_ls[i]=N-1 ; }else if (i==N-b+1 ) { ans_ls[i]=N; }else if (i<a-1 ){ ans_ls[i]=q.front (); q.pop_front (); }else { ans_ls[i]=q.back (); q.pop_back (); } } } cout<<"yes\n" ; for (int i=1 ;i<=N;++i) { cout<<ans_ls[i]<<" " ; } cout<<"\n" ; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); #ifdef LOCAL cout.setf (ios::unitbuf); #endif Solve (); return 0 ; }
心路历程(WA,TLE,MLE……)