#include #define ll long long #define pb push_back #define pix pair,int> #define ss second #define ff first using namespace std; class pixel { public: ll r, g, b; }; int w,h; clock_t begin_time; int res[600][600]; pixel pic[600][600]; pix picc[600][600]; map< pix , int> m; vector p; #define M_PI 3.14159265358979323846 double dokraja=0.0; bool cmpp(pair x, pair y) { return x.second > y.second; } ll udaljenost(pix a,pix b) { return (a.ss - b.ss)*(a.ss - b.ss) + (a.ff.ss - b.ff.ss)*(a.ff.ss - b.ff.ss) + (a.ff.ff - b.ff.ff)*(a.ff.ff - b.ff.ff); } pair, ll> kMeans(vector prev) { while(1){ if((clock()-begin_time)/CLOCKS_PER_SEC>=4.0-dokraja) break; vector now(prev.size(),{{0,0},0}); vector cnt(prev.size(),0); for(auto i: p){ int najblizi=0; int razmak = INT_MAX; for(int j=0;j, ll> kMedians(vector prev) { while(1){ if((clock()-begin_time)/CLOCKS_PER_SEC>=4.0-dokraja) break; vector now(prev.size(),{{0,0},0}); vector,vector>,vector>> cnt(prev.size()); for(auto i: p){ int najblizi=0; int razmak = INT_MAX; for(int j=0;j createStartingV(int k) { vector sol; vector> pp; vector distr(16, 1); for(auto i:p){ pp.pb({i, INT_MAX}); } srand(time(NULL)); for(int i=0;i distribution(distr.begin(),distr.end()); ll index = distribution(generator); index%=pp.size(); distr.clear(); sol.pb(pp[index].ff); //sol = kMeans(sol).ff; for(int j=0;j<(int)pp.size();j++){ for(auto o:sol){ pp[j].ss = min((ll)pp[j].ss, udaljenost(o, pp[j].ff)); } distr.pb(pp[j].ss*pp[j].ss); } } for(int i=0;i<16-k;i++){ sol.pb({{0,0}, 0}); } return sol; } vector createStartingVRand(int k) { vector sol; vector> pp; vector distr(16, 1); for(auto i:p){ pp.pb({i, INT_MAX}); } srand(time(NULL)); for(int i=0;i sol,int preskoci) { vector distr; for(auto i:p){ ll mini=LLONG_MAX; for(int j=0;j<16;j++){ if(j==preskoci)continue; mini=min(mini,udaljenost(i, sol[j])); } distr.pb(mini*mini); } default_random_engine generator; discrete_distribution distribution(distr.begin(), distr.end()); ll index = distribution(generator); index%=p.size(); return index; } void compress() { scanf("%d %d", &w, &h); //return w*h; dokraja = (w*h)/5000000.0; for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ pix temp; scanf("%d %d %d", &temp.ff.ff, &temp.ff.ss, &temp.ss); pic[i][j].r = temp.ff.ff; pic[i][j].g = temp.ff.ss; pic[i][j].b = temp.ss; p.pb(temp); } } vector sol = createStartingV(16); pair, ll> rez = kMeans(sol); vector prev = rez.ff; bool medians=true; srand(time(NULL)); bool isti=false; //vector pojavljivanja(16, 0); while((clock()-begin_time)/CLOCKS_PER_SEC<3.5){ vector pojavljivanja(16,0); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ int index=0; ll maxi = LLONG_MAX; int indexdrugi=-1; for(int k=0;k, ll> rez2; rez2 = kMeans(sol); if(medians)rez2 = kMedians(sol); else rez2 = kMeans(sol); medians=!medians; //printf("%lld\n",najmanje); if(rez2.ss < rez.ss){ rez.ss=rez2.ss; prev = rez2.ff; } } //printf("%lld\n",rez.ss); for(auto i : prev){ printf("%d %d %d\n",i.ff.ff, i.ff.ss, i.ss); } for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ int index=0; ll maxi = LLONG_MAX; for(int k=0;k poj[510][510]; int bio[510][510]; void decompress() { map sol; for(int i=0;i<16;i++){ pix x; scanf("%d %d %d", &x.ff.ff, &x.ff.ss, &x.ss); sol[i]= x; } int hh,ww; scanf("%d %d", &ww, &hh); for(int i=1;i<=hh;i++){ for(int j=1;j<=ww;j++){ scanf("%d", &res[i][j]); picc[i][j]=sol[res[i][j]]; } } for(int i=2;i