Pagini recente » Cod sursa (job #1085921) | Cod sursa (job #1765384) | Cod sursa (job #2266765) | Cod sursa (job #1869233) | Cod sursa (job #1955815)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cmath>
#include <iomanip>
#include <cassert>
using namespace std;
const int nmax=520;
bitset<2*nmax> a[nmax],current;
struct point
{
int x,y,tip;
}v[2*nmax],orig;
long double unghi[2*nmax];
long double xst,xdr,yst,ydr,angle,conv=180,ang1,ang2;
int i,n,j,ind,k,nr,X1,Y1,X2,Y2;
int p[nmax];
bool ok;
int det(point A,point B,point C)
{
return A.x*B.y+B.x*C.y+C.x*A.y+A.y*B.x+B.y*C.x+C.y*A.x;
}
long double get_angle(long double x,long double y)
{
angle=atan2(y,x);
if(angle<0) angle+=2*M_PI;
return (angle);
}
bool trigo(point unu,point doi)
{
//return (det(orig,unu,doi)>0);
return get_angle(unu.x,unu.y)<get_angle(doi.x,doi.y);
}
bool check()
{
for(int ceva=1;ceva<=n;ceva++)
if(current[ceva])
return 1;
return 0;
}
void baleiere()
{
for(i=1;i<=2*n;i++)
{
if(current[abs(v[i].tip)]) current[abs(v[i].tip)]=0;
else current[abs(v[i].tip)]=1;
if(check())
{
k++;
for(j=1;j<=n;j++)
a[j][k]=current[j];
xst=v[i].x;xdr=v[i+1].x;
yst=v[i].y;ydr=v[i+1].y;
//unghi[k]=((get_angle(xst,yst)+get_angle(xdr,ydr))/2)/M_PI*conv;
unghi[k]=get_angle((xst+xdr)/2,(yst+ydr)/2)/M_PI*conv;
while(unghi[k]>2*conv)
unghi[k]-=2*conv;
}
}
}
void gauss()
{
//n linii,k+1,coloane
for(i=1;i<=n;i++)
{
for(j=1;j<=k&&p[i]==0;j++)
if(a[i][j])
p[i]=j;
if(p[i]==0) continue;
for(ind=1;ind<=n;ind++)
if(ind!=i&&a[ind][p[i]])
a[ind]^=a[i];
}
}
int main()
{
ifstream f("laser.in");
ofstream g("laser.out");
f>>n;orig.x=0;orig.y=0;
for(i=1;i<=n;i++)
{
f>>X1>>Y1>>X2>>Y2;
v[i].x=X1;
v[i].y=Y1;
v[i].tip=i;
v[n+i].x=X2;
v[n+i].y=Y2;
v[n+i].tip=i;
ang1=get_angle(X1,Y1)/M_PI*conv;
ang2=get_angle(X2,Y2)/M_PI*conv;
if(max(ang1,ang2)-min(ang1,ang2)>180)
current[i]=1;
}
sort(v+1,v+2*n+1,trigo);
v[2*n+1]=v[1];
baleiere();
for(i=1;i<=n;i++)
{
f>>ok;
a[i][k+1]=ok;
}
gauss();
for(i=1;i<=n;i++)
if(a[i][k+1])
nr++;
g<<nr<<'\n';
for(i=1;i<=n;i++)
if(a[i][k+1])
g<<fixed<<setprecision(8)<<unghi[p[i]]<<'\n';
return 0;
}