- タイトル効果:シーケンスが、具体的な数値は、いくつかのヒントを与えているか分からない\(T_I、L_iを、R_iと\) 、\(T_I = 0 \)間隔表す\(L_iを\)にする(\ R_iとする)\順序、\(1 \ T_I =)順不同でした
- アイデア:最初にすべて満たすことができる全て-1配列、構築物\(T_I = 1 \)ケースを、各\(T_I = 0 \)第1の部分があるか否かを判断する\(T_I = 0 \)セクションがそれ以外整然と、非結合のままでなければならない要素を持つ要素の位置の後にタグの配列で表される満たすことができない含まれており、障害を持っている場合、含まれている。それぞれについて\(T_I = 0 \)することなく、その範囲内に見出さ(間隔を変更する必要がない障害の要素を有する場合)不規則に変化させることができる拘束要素
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<map>
#define ll long long
#define FOR(i,n) for(int i =1; i <= n;++i )
#define FOR0(i,n) for(int i =0; i < n;++i )
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1010;
int n,m;
struct node{
int t,l,r;
}b[maxn];
int arr[maxn];
int vis[maxn];
int cmp(node x,node y){
if(x.t == y.t){
if(x.l == y.l){
return x.t==1?x.r < y.r:x.r>=y.r;
}
return x.t==1? x.l < y.l: x.l>=y.l ;
}
return x.t > y.t;
}
int main(){
cin >> n >> m;
for(int i=1;i<=m;++i){
cin >> b[i].t >> b[i].l >> b[i].r;
}
for(int i=1;i<=n;++i){
arr[i] = 1;
}
sort(b+1,b+1+m,cmp);
int r=0;
bool sign= false;
for(int i=1;i<=m;++i){
if(!b[i].t){
r = i;
break;
}
for(int j=b[i].l;j<b[i].r;++j){
vis[j] = 1;
}
}
if(r==0){
cout <<"YES" <<endl;
for(int i=1;i<=n;++i) cout << arr[i] << ' ';
cout << endl;
}else{
for(int i=r;i<=m;++i){
for(int j=1;j<r;++j){
if(b[j].l<=b[i].l && b[j].r>=b[i].r){
sign = true;
break;
}
}
if(sign) break;
int j;
for(j=b[i].l;j<b[i].r;++j){
if(vis[j]==-1) break;
else if(vis[j]==0){
vis[j] = -1;
arr[j] = arr[j+1]+1;
break;
}
}
if(j==b[i].r){
sign = true; break;
}
}
if(sign) cout << "NO" <<endl;
else{
cout <<"YES"<<endl;
for(int i=1;i<=n;++i){
cout << arr[i] << ' ';
}
cout << endl;
}
}
return 0;
}
- 概要:一般的なアイデアは貪欲が、処理中である(T_I = 0 \)\間隔の左端から下降するとき、そうでなければプロセスは(QAQをハックすることによって)後の結果の前にカバーされます