给定一些区间,然后求是否存在三个互不覆盖的区间...
直接贪心,找出一个右边界最左的,和一个左边界最右的
再找是否存在一个区间能与这两个区间互不交叉
然而当我乐呵呵地开了int64之后发现MLE了...
然后想了半天...除了多次reset之外根本找不到不存l,r的方法啊...
那就存吧..发现官方题解上说用unsigned int,自然溢出真好啊!本来还担心10位乘10位int64也会乘爆
然后发现Pas里面还真有一个这样神奇的东西叫做longword...
乐呵呵地交了一发发现WA掉了...
机智地放弃了Pas..我相信一定是longword的自然溢出出现了问题
然后用C++写..就陷入了漫长的RE...
最后发现是变量开在了int main()里面...
唔...
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn = ;
unsigned int l[maxn],r[maxn];
int main(){
int test;
scanf("%d",&test);
while (test--){
unsigned int n,a,b,c,d,tem;
scanf("%d%d%d%d%d%d%d",&n,&l[],&r[],&a,&b,&c,&d);
for (int i=;i<=n;i++) l[i]=l[i-]*a+b,r[i]=r[i-]*c+d;
for (int i=;i<=n;i++) if (l[i]>r[i]){tem=l[i];l[i]=r[i];r[i]=tem;}
unsigned int x=r[],y=l[];
for (int i=;i<=n;i++){
if (r[i]<x) x = r[i];
if (l[i]>y) y = l[i];
}
int flag = ;
for (int i=;i<=n;i++) if (l[i]>x&&r[i]<y) flag = ;
if (flag) printf("YES\n");else printf("NO\n");
}
return ;
}
晚安
05/.May