Cod sursa(job #2482131)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 27 octombrie 2019 20:17:25
Problema Laser Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#define ver 0.000000001
#define P 3.14159265358979323846264338327950288
using namespace std;
ifstream fin ("laser.in");
ofstream fout("laser.out");
int n,m,x1,x2,y3,y2,i,j,x,y,a[1100][1100],sol[1100],t;
double segs[520],segd[520],v[1100],st,dr,ung[1100];
int verif()
{
    if(segd[i]-segs[i]>P)
        return (ung[j]<segs[i]+ver)||(ung[j]>segd[i]-ver);
    return (ung[j]-segs[i]>-ver&&segd[i]-ung[j]>-ver);
}
int main ()
{
    fin>>n;m=2*n;
    for(i=1;i<=n;i++)
    {
        fin>>x1>>y3>>x2>>y2;
        st=atan2(y3,x1);
        if(st<0) st+=2*P;
        dr=atan2(y2,x2);
        if(dr<0) dr+=2*P;
        v[i*2-1]=st;v[i*2]=dr;
        if(st-dr>ver) swap(st,dr);
        segs[i]=st;segd[i]=dr;
    }
    sort(v+1,v+m+1);
    for(i=1;i<m;i++) ung[i]=(v[i]+v[i+1])/2;
    ung[m]=2*P-ver;
    for(i=1;i<=n;i++) for(j=1;j<=m;j++)
        a[i][j]=verif();
    for(i=1;i<=n;i++) fin>>a[i][m+1];
    x=1;y=1;
    while(x<=n&&y<=m)
    {
        for(i=x;i<=n;i++) if(a[i][y]!=0) break;
        if(i==n+1)
        {
            y++;
            continue;
        }
        if(i!=x) for(j=1;j<=m+1;j++)
            swap(a[x][j],a[i][j]);
        for(i=x+1;i<=n;i++)
            if(a[i][y])
                for(j=y;j<=m+1;j++)
                    a[i][j]^=a[x][j];
        x++;y++;
    }
    int nr=0;
    for(i=n;i>=1;i--)
    {
        for(j=1;j<=m+1;j++) if(a[i][j]) break;
        if(j==m+2) continue;
        if(j==m+1) fout<<2/0;
        sol[j]=a[i][m+1];
        for(t=j+1;t<=m;t++)
            sol[j]^=sol[t]*a[i][t];
        if(sol[j]==1) nr++;
    }
    fout<<nr<<"\n";
    for(i=1;i<=m;i++)
        if(sol[i]==1) fout<<fixed<<setprecision(6)<<ung[i]/P*180<<"\n";
    return 0;
}