题意:给出n,l[1],r[1],a,b,c,d 其中 l[i]=l[i-1]*a+b,r[i]=r[i-1]*c+d;
问能否从这n个区间中选出不相交不重叠的三个区间
看的题解
先考虑最左边的区间,找出最小的rmin,即为最左边的区间,这样能够给剩下的两个区间腾出更多的选择空间
再考虑最右边的区间,找出最大的lmax,即为最右边的区间,这样也能够为剩下的一个空间腾出更多的选择空间
如果存在一个区间的l[i]>rmin,r[i]<lmax,那么就是“YES”
如果在这样的条件下都不存在,那就是"NO"
学习的----代码-
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 14 typedef long long LL; 15 const int INF = (1<<30)-1; 16 const int mod=4294967296; 17 const int maxn=10000005; 18 19 unsigned int l[maxn],r[maxn]; 20 21 int main(){ 22 int T; 23 scanf("%d",&T); 24 while(T--){ 25 memset(l,0,sizeof(l)); 26 memset(r,0,sizeof(r)); 27 28 unsigned int n,a,b,c,d; 29 cin>>n>>l[1]>>r[1]>>a>>b>>c>>d; 30 31 for(int i=2;i<=n;i++) l[i]=l[i-1]*a+b; 32 for(int i=2;i<=n;i++) r[i]=r[i-1]*c+d; 33 34 for(int i=1;i<=n;i++) 35 if(l[i]>r[i]) swap(l[i],r[i]); 36 37 int minn=r[1],maxx=l[1]; 38 for(int i=1;i<=n;i++){ 39 if(l[i]>maxx) maxx=l[i]; 40 if(r[i]<minn) minn=r[i]; 41 } 42 43 int flag=0; 44 for(int i=1;i<=n;i++){ 45 if(l[i]>minn&&r[i]<maxx){ 46 flag=1; 47 break; 48 } 49 } 50 51 if(flag) printf("YES\n"); 52 else printf("NO\n"); 53 } 54 return 0; 55 }
时间: 2024-11-08 20:00:12