모든 탱크들을 $y$로 오름차순 정렬해서 자신이 가야할 곳이 더 위인 탱크들은 제일 위부터, 아래로가야하는 탱크들은 제일 아래부터 각각 가야할 위치로 이동시켜주면 교차하는 문제가 발생하지 않게 된다.
voidsolve(){intn;cin>>n;vector<pi>a(n);for(auto&[y,x]:a)cin>>y>>x,y--,x--;vector<pair<int,char>>ans;viidx(n);iota(all(idx),0);sort(all(idx),[&](autoi,autoj){returna[i].fi<a[j].fi;});vito_y(n);for(inti=0;i<n;i++){to_y[idx[i]]=i;}viup,down;for(intj=0;j<n;j++){if(to_y[idx[j]]>a[idx[j]].fi)down.pb(idx[j]);if(to_y[idx[j]]<a[idx[j]].fi)up.pb(idx[j]);}// 위로 가야 하는 탱크들 for(intk:up){while(a[k].fi>to_y[k]){ans.pb({k,'U'});a[k].fi--;}}// 아래로 가야 하는 탱크들 reverse(all(down));for(intk:down){while(a[k].fi<to_y[k]){ans.pb({k,'D'});a[k].fi++;}}vix_fill(n);idx.clear();for(inti=0;i<n;i++){if(!x_fill[a[i].se])x_fill[a[i].se]=1;elseidx.pb(i);}vinot_fill;for(inti=0;i<n;i++)if(!x_fill[i])not_fill.pb(i);sort(all(idx),[&](inti,intj){returna[i].se<a[j].se;});for(inti=0;i<sz(idx);i++){intI=idx[i];intnxt=not_fill[i];for(intj=a[I].se;j^nxt;j<nxt?j++:j--){ans.pb({I,j<nxt?'R':'L'});}}cout<<sz(ans)<<endl;for(auto[a,b]:ans)cout<<a+1<<' '<<b<<endl;}
Comments