Cod sursa(job #1961203)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 10 aprilie 2017 22:45:26
Problema Divizori Primi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
#define BUF_MAX (1<<18)
char buf[BUF_MAX];
int poz=BUF_MAX;
inline char GetChar(){
    if(poz==BUF_MAX){
        fread(buf,1,BUF_MAX,stdin);
        poz=0;
    }
    return buf[poz++];
}
inline int GetInt(){
    int x=0;char c;
    do{
        c=GetChar();
    }while(!isdigit(c));
    do{
        x=x*10+c-'0';
        c=GetChar();
    }while(isdigit(c));
    return x;
}
int n,caz,k,r,mic,m;
struct usu
{
    int x,y,s;
}v[250003];
bool cmp(usu a,usu b)
{
    if(a.s>b.s) return 0;
    if(a.s==b.s&&a.x>b.x) return 0;
    if(a.s==b.s&&a.x==b.x&&a.y>b.y) return 0;
    return 1;
}
void solve()
{
    int i,rege;
    long num;
    rege=0;
    r=1;
    num=k;
    mic=v[1].s;
    i=1;
    while(r<n*m&&rege<k)
    {
        while(i<n*m&&v[i+1].s==v[i].s) ++i;
        if(i<n*m) rege=rege+i*(v[i+1].s-v[i].s);
		else rege=k;
        if(rege<k)
        {
            r=i;
            num=k-rege;
			++i;
			mic=v[i].s;
        }
    }
    if(i<=num) r=i;
	else if(r<num) r=num;
    mic=mic+num/i;
}
int main()
{
    freopen("rascoala.in","r",stdin);
    freopen("rascoala.out","w",stdout);
    caz=GetInt();
    n=GetInt();
    m=GetInt();
    k=GetInt();
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            v[(i-1)*m+j].s=GetInt();
            v[(i-1)*m+j].x=i;
            v[(i-1)*m+j].y=j;
        }
    }
    v[n*m+1].s=2000000005;
    sort(v+1,v+n*m+1,cmp);
    solve();
    if(caz==1) printf("%d\n%d",r,mic);
    else
    {
        int sol=0,usu;
        for(int i=1;i<r;++i)
        {
            for(int j=1;j<=r;++j)
            {
                usu=abs(v[i].x-v[j].x)+abs(v[i].y-v[j].y);
                if(usu>sol) sol=usu;
            }
        }
        printf("%d",sol);
    }
    return 0;
}