#include using namespace std; using ll=long long; ll linf=1000000000000000000; random_device seed_gen; mt19937 rnd(seed_gen()); template bool chmax(T& a,T b){ if(a bool chmin(T& a,T b){ if(a>b){ a=b; return true; }else return false; } vector dx={1,0,-1,0}; vector dy={0,1,0,-1}; struct bomb{ ll c,l; int id; vector> range; bomb(){} bomb(ll c,ll l,int id):c(c),l(l),id(id){range.resize(l);} }; struct bomb_instance{ int x,y; int id; set blown_shops; bomb_instance(){} bomb_instance(int x,int y,int id):x(x),y(y),id(id){} }; bool operator==(bomb_instance& a,bomb_instance &b){ return a.x==b.x&&a.y==b.y&&a.id==b.id; } int n,m; vector bombs; vector locates; vector grid; string ans; int ans_count; map,int> shop_num; vector> shop_location; set> shops; vector blown_num; void read_input(){ cin>>n>>m; ans_count=0; bombs.resize(m); grid.resize(n); for(int i=0;i>grid[i]; for(int i=0;i>c>>l; bombs[i]=bomb(c,l,i); for(int j=0;j>a>>b; bombs[i].range[j]=make_pair(a,b); } } sort(bombs.begin(),bombs.end(),[](bomb a,bomb b)->bool{ return a.c copy_grid=grid; auto good_bomb=[&](int x,int y)->void{ bomb_instance res; int max_score=0; for(int i=0;i0||ly>0)continue; }else{ if(lx>0||ly<0)continue; } }else{ if(y0)continue; }else{ if(lx<0||ly<0)continue; } } if(abs(nx)+abs(ny)=n||my<0||my>=n)continue; if(copy_grid[mx][my]=='#')score++; } if(score>max_score){ max_score=score; res=bomb_instance(x-nx,y-ny,bombs[i].id); } } int index=0; for(int i=0;i=n||res.y+ly<0||res.y+ly>=n)continue; copy_grid[res.x+lx][res.y+ly]='.'; if(shop_num.count({res.x+lx,res.y+ly})){ res.blown_shops.insert(shop_num[{res.x+lx,res.y+ly}]); } } for(int x:res.blown_shops)blown_num[x]++; locates.push_back(res); }; for(int i=n-1;i>=0;i--){ for(int j=0;j<=i;j++){ if(j>=n/2||i-j>=n/2)continue; int x=j,y=i-j; if(copy_grid[x][y]!='.')good_bomb(x,y); if(copy_grid[n-1-x][y]!='.')good_bomb(n-1-x,y); if(copy_grid[x][n-1-y]!='.')good_bomb(x,n-1-y); if(copy_grid[n-1-x][n-1-y]!='.')good_bomb(n-1-x,n-1-y); //for(string s:copy_grid)cout<> dist(n,vector(n,-1)); dist[now_x][now_y]=0; priority_queue,vector>,greater>> pq; pq.push(make_pair(0,from)); while(!pq.empty()){ int nx=pq.top().second/n,ny=pq.top().second%n; int l=pq.top().first; pq.pop(); if(dist[nx][ny]!=l)continue; if(nx*n+ny==to)break; for(int i=0;i<4;i++){ int nnx=nx+dx[i],nny=ny+dy[i]; if(nnx<0||nnx>=n||nny<0||nny>=n)continue; int nl=l+1; if(grid[nnx][nny]!='.')nl++; if(dist[nnx][nny]!=-1&&dist[nnx][nny]<=nl)continue; else dist[nnx][nny]=nl; pq.push(make_pair(nl,nnx*n+nny)); } } string route; string direction="ULDR"; int nx=next_x,ny=next_y; while(nx!=now_x||ny!=now_y){ for(int i=0;i<4;i++){ int nnx=nx+dx[i],nny=ny+dy[i]; if(nnx<0||nnx>=n||nny<0||nny>=n)continue; if((grid[nx][ny]=='.'&&dist[nnx][nny]+1==dist[nx][ny])||(grid[nx][ny]!='.'&&dist[nnx][nny]+2==dist[nx][ny])){ nx=nnx;ny=nny; route+=direction[i]; break; } } } ans_count+=route.size(); reverse(route.begin(),route.end()); for(char c:route){ ans+="1 "; ans+=c; ans+="\n"; } } int delete_bombs(){ vector copy_grid=grid; vector perm(locates.size()); for(int i=0;ivoid{ if(p+1==perm.size())return; int q=rnd()%(perm.size()-p); if(q!=0)swap(perm[p],perm[q+p]); random_perm(random_perm,p+1); }; random_perm(random_perm,0); vector sakuzyo; for(int index:perm){ int id=locates[index].id; int x=locates[index].x,y=locates[index].y; for(int j=0;j=n||y+dy<0||y+dy>=n)continue; if(copy_grid[x+dx][y+dy]!='.'){ ok=true; copy_grid[x+dx][y+dy]='.'; } } if(!ok)sakuzyo.push_back(index); break; } } } sort(sakuzyo.rbegin(),sakuzyo.rend()); int res=sakuzyo.size(); for(int i=0;i last_bomb; for(bomb_instance b:locates){ if(b.blown_shops.count(min_index))last_bomb.push_back(b); } for(bomb_instance b:last_bomb){ for(int i=0;i,int> shop_score; for(auto [sx,sy]:shops){ int score=0; for(auto b:locates)score+=(abs(sx-b.x)+abs(sy-b.y)); score/=locates.size(); shop_score[{sx,sy}]=score; } for(bomb_instance b:locates){ for(auto[sx,sy]:shops){ int score=abs(now_x-sx)+2*abs(sx-b.x)+abs(now_y-sy)+2*abs(sy-b.y); for(auto p:b.blown_shops)score+=shop_score[shop_location[p]]; if(score=n||now_y+y<0||now_y+y>=n)continue; grid[now_x+x][now_y+y]='.'; } } } for(int p:c.blown_shops){ if(shops.count(shop_location[p]))shops.erase(shop_location[p]); for(bomb_instance& b:locates)if(b.blown_shops.count(p))b.blown_shops.erase(p); } if(locates.size()>1)q-=delete_bombs(); } int next_shop_x=shop_location[min_index].first,next_shop_y=shop_location[min_index].second; go_straight(now_x*n+now_y,next_shop_x*n+next_shop_y); now_x=next_shop_x;now_y=next_shop_y; for(bomb_instance c:last_bomb){ ans+="2 "+to_string(c.id+1)+"\n"; ans_count++; } for(bomb_instance c:last_bomb){ go_straight(now_x*n+now_y,c.x*n+c.y); ans+="3 "+to_string(c.id+1)+"\n"; ans_count++; now_x=c.x;now_y=c.y; } cout<