分析:贪心,首先找到最右边的第一个左边界和最左边的第一个右边界。之后在判断是否有一个及一个以上的区间在这两个值之间,若有则能找到符合题意的三个区间,否则不能。
注意:这里利用的unsigned int的自然溢出决解了取模问题;第二个是一定生成完数据后在交换Li和Ri的值,这里被坑残了。
#include<iostream> using namespace std; //__int64 mod=4294967296;由于4294967296-1刚好是unsigned int类型的最大值,对它取模就相当于unsigned int溢出了 unsigned int L[10000005],R[10000005]; //因此这里不需要取模,利用溢出就相当于取摸了。 int main() { unsigned int T,N,L1,R1,a,b,c,d,i; unsigned int max,min; bool ok; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d%d%d",&N,&L1,&R1,&a,&b,&c,&d); i=0; L[i]=L1; R[i++]=R1; for(;i<N;i++) { L[i]=L[i-1]*a+b; R[i]=R[i-1]*c+d; } for(i=0;i<N;i++) //生成完数据后才能交换 if(L[i]>R[i]) swap(L[i],R[i]); max=L[0]; min=R[0]; for(i=1;i<N;i++) { max=L[i]>max?L[i]:max; //找到最右边的第一个左边界 min=R[i]<min?R[i]:min; //找到最左边的第一个右边界 } ok=false; for(i=0;i<N;i++) if(L[i]>min && R[i]<max) //如果存在一个区间在上述求出的最大值和最小值之间,则可以找到,否则不能 { ok=true; break; } if(ok) puts("YES"); else puts("NO"); } return 0; }
时间: 2024-10-06 14:59:19