题目描述
You are given an integer sequence x of length N. Determine if there exists an integer sequence a that satisfies all of the following conditions, and if it exists, construct an instance of a.
a is N2 in length, containing N copies of each of the integers 1, 2, …, N.
For each 1≤i≤N, the i-th occurrence of the integer i from the left in a is the xi-th element of a from the left.
Constraints
1≤N≤500
1≤xi≤N2
All xi are distinct.
a is N2 in length, containing N copies of each of the integers 1, 2, …, N.
For each 1≤i≤N, the i-th occurrence of the integer i from the left in a is the xi-th element of a from the left.
Constraints
1≤N≤500
1≤xi≤N2
All xi are distinct.
输入
The input is given from Standard Input in the following format:
N
x1 x2 … xN
N
x1 x2 … xN
输出
If there does not exist an integer sequence a that satisfies all the conditions, print 'No'. If there does exist such an sequence a, print 'Yes'.
样例输入
3
1 5 9
样例输出
Yes
#include <bits/stdc++.h> using namespace std; #define ll long long int a[255000]; struct node { int num; int x; }s[2550]; bool cmp(node a,node b) { return a.x<b.x; } int main() { int i,j,n; cin>>n; for(i=1;i<=n;i++){ cin>>s[i].x; s[i].num=i; } sort(s+1,s+n+1,cmp); int now=1; for(i=1;i<=n;i++){ a[s[i].x]=s[i].num; for(j=1;j<s[i].num;j++){ while(a[now]) now++; a[now]=s[i].num; } if(now>s[i].x) {cout<<"No"<<endl;return 0;} } for(i=1;i<=n;i++){ for(j=1;j<=n-s[i].num;j++){ while(a[now]) now++; if(now<s[i].x) {cout<<"No"<<endl;return 0;} a[now]=s[i].num; } } cout<<"Yes"<<endl; return 0; }
For each 1≤i≤N, the i-th occurrence of the integer i from the left in a is the xi-th element of a from the left.
就这句话。。。仔细读
第i个i在下标为xi的地方。嗯
这是贪心,先放上这些数字应在的位置
再从小到大把i弄上去
排除不可能的解