代码:
#include
#include
using namespace std;
vector v(20,1);
int main()
{
int number,memo;
int i,j,flag1=0,flag2=0,flag3=0,flag4=0;
cin>>number>>memo;
int anum[number],bnum[number];
int out[memo]; //0 no 1 yes
int cnum[memo],dnum[memo],fnum[memo];
char alee[number];
for(i=0;i<number;i++)
{
cin>>anum[i]>>bnum[i]>>alee[i];
}
for(i=0;i<memo;i++)
{
cin>>cnum[i]>>dnum[i]>>fnum[i];
}
for(j=0;j<memo;j++)
{
flag1=0;
flag2=0;
flag3=0;
flag4=0;
for(i=0;i<number;i++)
{
if(alee[i]=='A')
{
//cout<<j<<"--A-- " << cnum[j]+dnum[j]*anum[i]+fnum[j]*bnum[i]<<endl;
if( (cnum[j]+dnum[j]*anum[i]+fnum[j]*bnum[i] ) >0)
{
flag1=1;
}
else
{
flag2=1;
}
if(flag2==flag1&&flag1==1)
{
out[j]=0;
flag1=0;
flag2=0;
break;
}
}
if(alee[i]=='B')
{
//cout<<j<<"--B-- " <<cnum[j]+dnum[j]*anum[i]+fnum[j]*bnum[i]<<endl;
if( (cnum[j]+dnum[j]*anum[i]+fnum[j]*bnum[i] ) <0)
{
flag3=1;
}
else
{
flag4=1;
}
if(flag3==flag4&&flag4==1)
{
out[j]=0;
flag3=0;
flag4=0;
//cout<<"kaka";
break;
}
}
}
if( (flag1==flag3&&flag1==1) ||(flag2==flag4&&flag2==1) )
{
out[j]=1;
//cout<<"zoule";
}
}
for(i=0;i<memo;i++)
{
if(out[i]==1)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
ccf第一题,笨办法,直接根据数据开对应的数组,核心:判断同样的点在线上还是线下,若出现一个在上,一个在下,直接跳出循环(注意把flag置为0),否定该线段,如果最后点都在一侧,则比较两种点是不是不在一边,是的话就yes。
(注意flag变化)