思维 区间问题

题意: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]) ;
} 
发布了187 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/94399165