Cod sursa(job #2377885)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 11 martie 2019 13:15:18
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <algorithm>
#define DIMN 50100
using namespace std;
double a[DIMN],b[DIMN],k[DIMN],q[DIMN],s[DIMN];
int v[DIMN];
pair <int,int> vit[DIMN];
int main()
{
    FILE *fin=fopen ("xmoto.in","r");
    FILE *fout=fopen ("xmoto.out","w");
    int n,l,i,sol=0;
    double sa,sb,sk,sq,st,dr,mid,mid2;
    fscanf (fin,"%d%d",&n,&l);
    sa=sb=sk=sq=0.0;
    for (i=1;i<=n;i++){
        fscanf (fin,"%lf%lf%lf%lf%d",&a[i],&b[i],&k[i],&q[i],&v[i]);
        vit[i]=make_pair(v[i],i);
        sa+=a[i];
        sk+=k[i];
    }
    vit[n+1]=make_pair(10000,n+1);
    sort (vit,vit+n+2);
    for (i=0;i<=n;i++){ /// ( vit[i] , vit[i+1] ]
        if (vit[i].first==vit[i+1].first){
            sa-=a[vit[i].second];
            sb+=b[vit[i].second];
            sk-=k[vit[i].second];
            sq+=q[vit[i].second];
            continue;
        }
        /// v * (sa + sb) +sk + sq = L
        st=(vit[i].first+1)*1000000;
        dr=(vit[i+1].first)*1000000;
        while (st<=dr){
            mid=(st+dr)/2;
            mid2=1.0*mid/1000000;
            if (mid2 *(sa+sb)+sk+sq==l)
                break;
            else if ((mid2 *(sa+sb)+sk+sq>l && sa+sb>0) || (mid2 *(sa+sb)+sk+sq<l && sa+sb<0))
                dr=mid-1;
            else st=mid+1;
        }
        if (st<=dr)
            s[++sol]=mid;
        sa-=a[vit[i].second];
        sb+=b[vit[i].second];
        sk-=k[vit[i].second];
        sq+=q[vit[i].second];

    }
    fprintf (fout,"%d\n",sol);
    for (i=1;i<=sol;i++)
        fprintf (fout,"%.6lf ",s[i]);
    return 0;
}