#include using namespace std; const int nmax=1e3+42,TL=4.5; int n,m,mx,t; int inp[nmax][nmax]; bool been[nmax][nmax]; vector< pair > path,best_now,output; int score=0; void print() { //printf("%i\n",score); if(output.size()==0)output=best_now; printf("%i\n",output.size()); for(auto k:output) printf("%i %i\n",k.first,k.second); exit(0); } int x_[4]={1,-1,0,0}; int y_[4]={0,0,-1,1}; bool free(int x,int y) { if(1>x||x>n||1>y||y>m)return 0; if(been[x][y])return 0; if(inp[x][y]==-1)return 0; return 1; } vector< pair > adj[nmax][nmax]; int gain[5]={0,5,4,3,2}/*{0,1,5,4,3}*//*{0,1,2,3,4}*/; int eval(pair a) { int ret=0; for(int i=0;i<4;i++) if(free(a.first+x_[i],a.second+y_[i]))ret++; return ret; } bool cmp(pair a,pair b) { return gain[eval(a)]>gain[eval(b)]; } int when=0; void dfs(int x,int y) { when=(when+1)%10000; if(when==0) { if(1.0*(clock()-t)/CLOCKS_PER_SEC>TL)print(); } //cout<<"dfs "<best_now.size()) { best_now=path; } path.pop_back(); } const int LIM=(1<<20)+42; int tree[LIM],dp[LIM]; void build(int node,int l,int r) { if(l==r) { tree[node]=0; return; } int av=(l+r)/2; build(node*2,l,av); build(node*2+1,av+1,r); tree[node]=0; } int query(int node,int l,int r,int lq,int rq) { if(l==lq&&r==rq)return tree[node]; int av=(l+r)/2,ret=0; if(lq<=av)ret=max(ret,query(node*2,l,av,lq,min(av,rq))); if(av now) { //for(auto k:now)cout< "< help=work; sort(help.begin(),help.end()); for(int i=0;i > order={}; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(free(i,j)) { order.push_back({i,j}); //if(order.size()==1)i=n,j=m;//remove this } random_shuffle(order.begin(),order.end()); for(auto k:order) { //cout<<"begin "< v={}; for(auto p:best_now) v.push_back(inp[p.first][p.second]); int score_now=evaluate(v); if(score_now>score) { score=score_now; output=best_now; } } print(); } int dp_up[nmax],dp_down[nmax]; bitset<21> mem[102][102][102][21]; void dfs_smallest(int x,int y,int lis,int lds,int sz) { //cout<<"dfs_smallest "<TL)print(); } if(free(x,y)==0) { return; } path.push_back({x,y}); been[x][y]=1; dp_up[sz]=0; for(int i=0;iinp[x][y])dp_down[sz]=max(dp_down[sz],dp_down[i]); dp_down[sz]++; lds=max(lds,dp_down[sz]); if(lis*lds>score) { score=lis*lds; //cout<<"LIS= "<