C. Vasya And Array

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
 
int n,m;
int t[1005],l[1005],r[1005],rest;
int cf[1005],sum[1005],tot=1,dx[1005],res[1005];
 
int main(){     cin>>n>>m;rest=n;     for(int i=1;i<=m;i++){         cin>>t[i]>>l[i]>>r[i];         if(t[i]==1){             cf[l[i]]++;             cf[r[i]]--;         }     }     int sum=0;     for(int i=1;i<=n;i++){         sum+=cf[i];         if(sum>0){             dx[i]=0;         }         else dx[i]=-1;     }     res[0]=n;     for(int i=1;i<=n;i++){         res[i]=res[i-1]+dx[i];     }          for(int i=1;i<=m;i++){         if(t[i]==0){             if(res[l[i]-1]-res[r[i]-1]==0){                 cout<<"NO"<<endl;                 return 0;             }         }     }     cout<<"YES"<<endl;     for(int i=0;i<n;i++){         cout<<res[i]<<" ";     }
}


嘛,我看到这个题,原本是想乱搞,没有想到差分。。。。

。。。。。
首先差分------让每一个区间+1
随后再前缀和,  每个位置为0的就说明这个位置不是排序的
随后关键的一个暴力 
1:前缀和搞一搞
因为题目要求t1区间内严格不下降  那直接严格的相等(最好相等于N<----->考虑到就算没有t1的情况也可以下降n次,保证最后有的分配)
令num=n
然后对于每个位置大于0的就是num,遇到等于0就num-1,然后接着来,,,最后处理处P(保证了答案的正确性的同事,也体现了暴力之美。。。。。)

然后就是判断YES,NO
当Ti为0时,如果Li位置上的前缀和小于等于Ri位置上的前缀和,那就肯定是NO
因为当Li==Ri时,这个区间相等,不满足unsort

综上
Q.E.D



全部评论

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务