Cod sursa(job #2465864)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 30 septembrie 2019 23:02:32
Problema Laser Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int N=515;
const double PI=3.14159265359;
const double EPS=0.00001;
int mat[N][2*N];
int sol[2*N];
double deg(double rad){
  return rad*180/PI;
}
double makepoz(double rad){
  if(rad<0)
    rad+=2*PI;
  return rad;
}
struct coord{
  int x,y;
};
vector<double> ans;
coord v[N][2];
double laser[2*N];
int main()
{
  FILE*fin,*fout;
  fin=fopen("laser.in","r");
  fout=fopen("laser.out","w");
  int n;
  fscanf(fin,"%d",&n);
  for(int i=1;i<=n;i++){
    fscanf(fin,"%d%d%d%d",&v[i][0].x,&v[i][0].y,&v[i][1].x,&v[i][1].y);
  }
  for(int i=1;i<=n;i++){
    double rad1,rad2;
    rad1=min(makepoz(atan2(v[i][0].y,v[i][0].x)),makepoz(atan2(v[i][1].y,v[i][1].x)));
    rad2=max(makepoz(atan2(v[i][0].y,v[i][0].x)),makepoz(atan2(v[i][1].y,v[i][1].x)));
    for(int j=1;j<=n;j++){
      for(int k=0;k<=1;k++){
        double rad=makepoz(atan2(v[j][k].y,v[j][k].x));
        laser[j+k*n]=rad;
        if(rad-rad1>=-EPS && rad-rad2<=EPS){
          mat[i][j+k*n]=1;
        }
      }
    }
  }
  for(int i=1;i<=n;i++){
    fscanf(fin,"%d",&mat[i][2*n+1]);
  }
  int lin=1,poz=1;
  while(lin<=n && poz<=2*n+1){
    int l=lin;
    for(l=lin;l<=n;l++){
      if(mat[l][poz]>0){
        break;
      }
    }
    if(l==n+1){
      poz++;
      continue;
    }
    if(l!=lin){
      for(int i=poz;i<=2*n+1;i++)
        swap(mat[lin][i],mat[l][i]);
    }
    for(int i=lin+1;i<=n;i++){
      if(mat[i][poz]){
        for(int j=poz;j<=2*n+1;j++)
          mat[i][j]^=mat[lin][j];
      }
    }
    lin++;
    poz++;
  }
  for(int i=n;i>=1;i--){
    for(int j=1;j<=2*n+1;j++){
      if(mat[i][j]){
        if(j==2*n+1){
          fprintf(fout,"0\n");
          return 0;
        }
        sol[j]=mat[i][2*n+1];
        for(int k=2*n;k>j;k--)
          sol[j]^=(sol[k]*mat[i][k]);
        if(sol[j]==1){
          ans.push_back(deg(laser[j]));
        }
        break;
      }
    }
  }
  fprintf(fout,"%d\n",ans.size());
  for(auto x:ans){
    fprintf(fout,"%.6f\n",x);
  }
  return 0;
}