题意:n个数的序列a,满足m个条件,每个条件是三个数:t,l,r,t=0时表示[l,r]不是非降序的,t=1时表示[l,r]是非降序的。若可以构造这样的序列a,输出满足题意的任何一个序列a。
题解:s序列初始化为0,s[i] = 1表示[i,i+1]是非降序的,构造这样的序列s。这样可以区分(1,5)(6,7)是两个不同的有序区间然后当s[i] = 1时,使a[i+1]=a[i],s[i] = 0时,使a[i+1]=a[i]-1。这样使非降序的全部非降序。然后判定所有t=0的条件,若a[l]=a[r],则证明[l,r]的序列全部相等,是非降序的,不符合题意。
题目链接:http://codeforces.com/contest/1187/problem/C
AC代码:
#include<bits/stdc++.h>
#define N 1005
using namespace std ;
int n , m ;
int x , y , z ;
int a[N] , l[N] , r[N] ;
int numus = 0 ;
bool s[N] ;
int main()
{
int i ;
scanf("%d%d" , &n , &m) ;
memset(s , 0 , sizeof(s)) ;
while(m --)
{
scanf("%d%d%d" , &x , &y , &z) ;
if(x == 1)
for(i = y ; i < z ; i ++)
s[i] = 1 ;
else
{
numus ++ ;
l[numus] = y ;
r[numus] = z ;
}
}
a[1] = 1e8 ;
for(i = 2 ; i <= n ; i ++)
if(s[i - 1]) //这样可以区分(1,5)(6,7)是两个不同的有序区间
a[i] = a[i - 1] ; //先构造有序的序列
else
a[i] = a[i - 1] - 1 ; //未提及的就构造降序
for(i = 1 ; i <= numus ; i ++) //判定是否符合降序
if(a[l[i]] == a[r[i]]) //若降序列的两个端点相等,则中间相等,则不是降序序列
{
printf("NO") ;
return 0 ;
}
printf("YES\n") ;
for(i = 1 ; i <= n ; i ++)
printf("%d " , a[i]) ;
}