题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5214
题面:
2 3 1 4 1 1 1 1 3 1 4 4 1 4 1
NO YES
解题:开始没想到贪心,后来仔细一想还是挺清晰的,取两头最边上的,中间遍历,这样都找不到可行解的话,自然就无解了。排序实际上是没有必要的,排个序都O(nlogn)了,遍历一遍只需O(n)。
坑点:
1.l,r可能开始就大小相反
2.全部生成完数据后,才交换。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct info
{
unsigned int l,r;
}store[10000005];
unsigned MAX(unsigned a,unsigned b)
{
if(a>b)return a;
else return b;
}
unsigned MIN(unsigned a,unsigned b)
{
if(a<b)return a;
else return b;
}
int main()
{
unsigned t,n,le,ri,a,b,c,d,tmp,cnt,minri,maxle;
cin>>t;
bool flag;
while(t--)
{
cnt=0;
flag=false;
cin>>n>>le>>ri>>a>>b>>c>>d;
if(le>ri)
{
minri=le;
maxle=ri;
}
else
{
minri=ri;
maxle=le;
}
store[cnt].l=le;
store[cnt].r=ri;
cnt++;
for(unsigned i=1;i<n;i++)
{
le=(le*a + b);
ri=(ri*c + d);
tmp=MIN(le,ri);
if(tmp>maxle)
maxle=tmp;
tmp=MAX(le,ri);
if(tmp<minri)
minri=tmp;
store[cnt].l=le;
store[cnt].r=ri;
cnt++;
}
for(int i=0;i<cnt;i++)
{
le=MIN(store[i].l,store[i].r);
ri=MAX(store[i].l,store[i].r);
if(le>minri&&ri<maxle)
{
flag=true;
break;
}
}
if(flag)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
原文地址:http://blog.csdn.net/david_jett/article/details/45542833