分析:贪心,首先找到最右边的第一个左边界和最左边的第一个右边界。之后在判断是否有一个及一个以上的区间在这两个值之间,若有则能找到符合题意的三个区间,否则不能。
注意:这里利用的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;
}
HDU ACM 5214 Movie ->贪心+自然溢出取模->水题里的学问
原文地址:http://blog.csdn.net/a809146548/article/details/45827571