Cod sursa(job #2037768)

Utilizator modulopaulModulopaul modulopaul Data 12 octombrie 2017 19:16:02
Problema Elimin Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <cstdio>
#define MAXNM 3647
#define sh short

using namespace std;
FILE *fin=fopen("elimin.in","r"),*fout=fopen("elimin.out","w");
sh n,m,R,C,mt[MAXNM][MAXNM];
struct help{
    int poz,s;
}r[MAXNM],c[MAXNM];
int poz(sh p,sh q,help v[]){
    sh st=p,dr=q,x=v[p].s,pt=v[p].poz;
    while(st<dr){
        while(st<dr and v[dr].s>=x) dr--;
        v[st].s=v[dr].s;
        v[st].poz=v[dr].poz;
        while(st<dr and v[st].s<=x) st++;
        v[dr].s=v[st].s;
        v[dr].poz=v[st].poz;
    }
    v[st].s=x;
    v[st].poz=pt;
    return st;
}
void QS(sh p,sh q,help v[]){
    int m=poz(p,q,v);
    if(m-1>p) QS(p,m-1,v);
    if(m+1<q) QS(m+1,q,v);
}
sh mx(sh a,sh b){
    if(a>b) return a;
    return b;
}
int main(){
    int ts=0;
    fscanf(fin,"%hd",&n);
    fscanf(fin,"%hd",&m);
    fscanf(fin,"%hd%hd",&R,&C);
    for(sh i=1;i<=n;i++){
        for(sh j=1;j<=m;j++){
            fscanf(fin,"%hd",&mt[i][j]);
            r[i].s+=mt[i][j];
            c[j].s+=mt[i][j];
            r[i].poz=i;
            c[j].poz=j;
            ts+=mt[i][j];
        }
    }
    QS(1,n,r);
    QS(1,m,c);
    for(sh i=1;i<=mx(R,C);i++){
        if(i<=R) ts-=r[i].s;
        if(i<=C) ts-=c[i].s;
    }
    for(sh i=1;i<=R;i++){
        for(sh j=1;j<=C;j++){
            ts+=mt[r[i].poz][c[j].poz];
            cout<<r[i].poz<<' '<<c[j].poz;
        }
    }
    fprintf(fout,"%d",ts);
    return 0;
}