题意:
解法:
对于操作1 , 如果( l1, r1) 和( l2, r2) 相交, 那么显然可以合并区间.
对于操作1 , 我们将( l, r) 所在的区间标记为i,
( l, r) 所在的区间包括了( l, r) 能合并到的区间.
最后整个序列就被[ 0 , n] 分成若干段,
对于操作2 , 如果( l, r) 只在某一段内, 那么无解, 否则有解.
令第一段的值全部为n, 第二段的值全部为n- 1. . . .
这样一定满足条件.
code:
#include <bits/stdc++.h>
using namespace std;
const int maxm= 1e3 + 5 ;
int op[ maxm] , l[ maxm] , r[ maxm] ;
int a[ maxm] ;
int n, m;
void update ( int x) {
map< int , int > mp;
for ( int i= l[ x] ; i<= r[ x] ; i++ ) {
if ( a[ i] ) mp[ a[ i] ] = 1 ;
a[ i] = x;
}
for ( int i= 1 ; i<= n; i++ ) {
if ( mp[ a[ i] ] ) a[ i] = x;
}
}
int check ( int x) {
map< int , int > mp;
for ( int i= l[ x] ; i<= r[ x] ; i++ ) {
if ( a[ i] ) mp[ a[ i] ] = 1 ;
else return 1 ;
}
if ( mp. size ( ) == 1 ) return 0 ;
return 1 ;
}
void solve ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= m; i++ ) {
cin>> op[ i] >> l[ i] >> r[ i] ;
}
for ( int i= 1 ; i<= m; i++ ) {
if ( op[ i] == 1 ) {
update ( i) ;
}
}
for ( int i= 1 ; i<= m; i++ ) {
if ( op[ i] == 0 ) {
if ( ! check ( i) ) {
cout<< "NO" << endl;
return ;
}
}
}
cout<< "YES" << endl;
int last= n;
for ( int i= 1 ; i<= n; i++ ) {
cout<< last<< ' ' ;
if ( a[ i+ 1 ] == 0 || a[ i+ 1 ] != a[ i] ) last-- ;
}
}
signed main ( ) {
ios:: sync_with_stdio ( 0 ) ; cin. tie ( 0 ) ;
solve ( ) ;
return 0 ;
}