結果
問題 | No.5019 Hakai Project |
ユーザー |
![]() |
提出日時 | 2023-11-19 20:21:03 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 9,783 bytes |
コンパイル時間 | 3,079 ms |
コンパイル使用メモリ | 215,956 KB |
実行使用メモリ | 6,676 KB |
スコア | 449,174,138 |
最終ジャッジ日時 | 2023-11-19 20:21:13 |
合計ジャッジ時間 | 8,908 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge11 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 37 WA * 13 |
ソースコード
#include <iostream> // cout, endl, cin#include <string> // string, to_string, stoi#include <vector> // vector#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound#include <utility> // pair, make_pair#include <tuple> // tuple, make_tuple#include <cstdint> // int64_t, int*_t#include <cstdio> // printf#include <map> // map#include <queue> // queue, priority_queue#include <set> // set#include <stack> // stack#include <deque> // deque#include <unordered_map> // unordered_map#include <unordered_set> // unordered_set#include <bitset> // bitset#include <cctype> // isupper, islower, isdigit, toupper, tolower#include <iomanip>//fixed,setprecision#include <limits.h>//INT_MAX#include <math.h>//M_PI#include <random>#include <regex> // 正規表現#include <time.h>#include <fstream>#include <array>#include <bit>#include <chrono>#include <ranges>#include <span>#include <cmath>#include <cstdint>#include <complex>//複素数//#include <bits/stdc++.h>using namespace std;#define ll long long#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)template < typename T > std::string to_string( const T& n ){std::ostringstream stm ;stm << n ;return stm.str() ;}int RandInt(int L,int R){return rand()%(R-L+1)+L;}int N,M;vector<string> A;vector<string> moto_A;vector<pair<int,vector<pair<int,int>>>> bomb;vector<pair<int,string>> ans;vector<pair<int,int>>tatemono;vector<pair<int,int>>bakudanya;vector<int>bakuha_zahyo;int max_cnt_num=1;int max_cnt=0;int min_cost_num=1;int min_cost=1<<30;int bakudan_cnt=0;void input(){cin>>N>>M;A.resize(N);moto_A.resize(N);for(int i=0; i<N; i++){cin>>A[i];moto_A[i]=A[i];}bomb.resize(M);for(int i=0; i<M; i++){int C,L;cin>>C>>L;bomb[i].first=C;//first:Costif(min_cost>C){min_cost=C;min_cost_num=i+1;}if(max_cnt<L){max_cnt=L;max_cnt_num=i+1;}for(int j=0; j<L; j++){int a,b;cin>>a>>b;bomb[i].second.push_back(make_pair(a,b));//second.first:壊せるマスのiからのx方向距離 second.second: y方向距離}}}void bakuha(int i,int j,int num){num--;//cerr<<bomb[num].second.size()<<" ";rep(ni,bomb[num].second.size()){int x=i+bomb[num].second[ni].first;int y=j+bomb[num].second[ni].second;//cerr<<x<<" "<<y<<endl;if(x<0||x>=N||y<0||y>=N)continue;//cerr<<"a";A[x][y]='.';}}void mukau(int sx,int sy,int gx,int gy){if(sx<gx){rep(i,gx-sx)ans.push_back(make_pair(1,"D"));}if(gx<sx){rep(i,sx-gx)ans.push_back(make_pair(1,"U"));}if(sy<gy){rep(j,gy-sy)ans.push_back(make_pair(1,"R"));}if(gy<sy){rep(j,sy-gy)ans.push_back(make_pair(1,"L"));}}//建物を爆破できるいちばん近い場所に移動するpair<int,int> ido(int nowx,int nowy,int bakuhax,int bakuhay,int num){num--;int kyori=2500;int gx=10000;int gy=10000;rep(ni,bomb[num].second.size()){int x=bakuhax-bomb[num].second[ni].first;int y=bakuhay-bomb[num].second[ni].second;//cerr<<x<<" "<<y<<endl;if(x<0||x>=N||y<0||y>=N)continue;if(abs(x-nowx)+abs(y-nowy)<kyori){gx=x;gy=y;kyori=abs(x-nowx)+abs(y-nowy);}}//cerr<<nowx<<" "<<nowy<<" "<<gx<<" "<<gy<<endl;return make_pair(gx,gy);}void kesu(vector<int>&bakuha_zahyo,int num){num--;vector<int>iranai(bakuha_zahyo.size(),0);vector<vector<int>>masu(N,vector<int>(N,0));rep(nj,bakuha_zahyo.size()){int i=bakuha_zahyo[nj]/N;int j=bakuha_zahyo[nj]%N;rep(ni,bomb[num].second.size()){int x=i+bomb[num].second[ni].first;int y=j+bomb[num].second[ni].second;if(x<0||x>=N||y<0||y>=N)continue;masu[x][y]++;}}rep(nj,bakuha_zahyo.size()){int i=bakuha_zahyo[nj]/N;int j=bakuha_zahyo[nj]%N;bool hantei=true;rep(ni,bomb[num].second.size()){int x=i+bomb[num].second[ni].first;int y=j+bomb[num].second[ni].second;if(x<0||x>=N||y<0||y>=N)continue;if(masu[x][y]<=1&&moto_A[x][y]!='.')hantei=false;}if(hantei){iranai[nj]=1;rep(ni,bomb[num].second.size()){int x=i+bomb[num].second[ni].first;int y=j+bomb[num].second[ni].second;if(x<0||x>=N||y<0||y>=N)continue;masu[x][y]--;}}}vector<int>iru;rep(i,bakuha_zahyo.size()){if(iranai[i]==0){iru.push_back(bakuha_zahyo[i]);}else{bakudan_cnt--;}}bakuha_zahyo=iru;}int nokori_bakudanya_cnt(int i,int j,int num){//cerr<<__LINE__<<"-----"<<endl;vector<string>B(N);rep(i,N)B[i]=A[i];//cerr<<__LINE__<<"-----"<<endl;num--;//cerr<<bomb[num].second.size()<<" ";rep(ni,bomb[num].second.size()){int x=i+bomb[num].second[ni].first;int y=j+bomb[num].second[ni].second;//cerr<<x<<" "<<y<<endl;if(x<0||x>=N||y<0||y>=N)continue;//cerr<<"a";B[x][y]='.';}int res=0;rep(i,bakudanya.size()){int x=bakudanya[i].first;int y=bakudanya[i].second;if(B[x][y]=='@')res++;}//cerr<<"nokori"<<res<<endl;return res;}int main(){int TIMELIMIT=1.5*CLOCKS_PER_SEC;int ti=clock();int betu_cnt=0;int now_bakudan_cnt=0;//vector<pair<int,string>> ans_yamanobori;input();cerr<<__LINE__<<"-----"<<endl;int kind=max_cnt_num;//int kind=min_cost_num;cerr<<min_cost_num<<" "<<max_cnt_num<<endl;int building_cnt=0;rep(i,N)rep(j,N){if(A[i][j]=='#')tatemono.emplace_back(i,j);if(A[i][j]=='@')bakudanya.emplace_back(i,j);}int x=bakudanya[0].first;int y=bakudanya[0].second;int chikai=2500;int last_bakudanya=0;//爆弾のある地点に行くrep(i,bakudanya.size()){if(abs(N/2-bakudanya[i].first)+abs(N/2-bakudanya[i].second)<chikai){x=bakudanya[i].first;y=bakudanya[i].second;chikai=abs(N/2-bakudanya[i].first)+abs(N/2-bakudanya[i].second);last_bakudanya=i;}}cerr<<__LINE__<<"-----"<<endl;mukau(0,0,x,y);rep(i,10)ans.push_back(make_pair(2,to_string(kind)));//爆弾を買うnow_bakudan_cnt=10;mukau(x,y,N/2,N/2);ans.push_back(make_pair(3,to_string(kind)));betu_cnt++;now_bakudan_cnt--;x=N/2;y=N/2;bakuha(x,y,kind);cerr<<__LINE__<<"-----"<<endl;//建物のある地点に行くint bakudan_saigo_cnt=0;int x_keep=x,y_keep=y;rep(i,N)rep(j,N){int nx=i;int ny=j;//cerr<<__LINE__<<"-----"<<endl;if(A[nx][ny]=='#'||A[nx][ny]=='@'){pair<int,int>p=ido(x,y,nx,ny,kind);int ni=p.first;int nj=p.second;//cerr<<__LINE__<<"-----"<<ni<<" "<<nj<<endl;int nokori=nokori_bakudanya_cnt(ni,nj,kind);cerr<<"nokori"<<nokori<<" bakudan"<<now_bakudan_cnt<<endl;if(nokori>0&&now_bakudan_cnt==1){cerr<<__LINE__<<"-----aru"<<ni<<" "<<nj<<endl;rep(k,bakudanya.size()){int bx=bakudanya[k].first;int by=bakudanya[k].second;if(A[bx][by]=='@'){cerr<<"kau";mukau(x,y,bx,by);//pair<int,int>p=ido(x,y,bx,by,kind);x=bx;y=by;rep(l,10)ans.push_back(make_pair(2,to_string(kind)));//爆弾を買うnow_bakudan_cnt+=10;last_bakudanya=i;break;}}p=ido(x,y,nx,ny,kind);ni=p.first;nj=p.second;mukau(x,y,ni,nj);bakuha_zahyo.emplace_back(ni*N+nj);x=ni;y=nj;bakuha(x,y,kind);ans.push_back(make_pair(3,to_string(kind)));betu_cnt++;now_bakudan_cnt--;}else if(nokori>0&&now_bakudan_cnt>=1){cerr<<__LINE__<<"-----"<<ni<<" "<<nj<<endl;mukau(x,y,ni,nj);bakuha_zahyo.emplace_back(ni*N+nj);x=ni;y=nj;bakuha(x,y,kind);ans.push_back(make_pair(3,to_string(kind)));betu_cnt++;now_bakudan_cnt--;}else {mukau(x,y,ni,nj);cerr<<__LINE__<<"-----"<<ni<<" "<<nj<<endl;bakuha_zahyo.emplace_back(ni*N+nj);x=ni;y=nj;bakuha(x,y,kind);ans.push_back(make_pair(3,to_string(kind)));bakudan_saigo_cnt++;}}}cerr<<"ans"<<ans.size()<<" "<<bakudan_saigo_cnt<<endl;//rep(i,ans.size())cout<<ans[i].first<<" "<<ans[i].second<<endl;cout<<ans.size()+bakudan_saigo_cnt<<endl;for(pair<int,string> i:ans){cout<<i.first<<" "<<i.second<<endl;if(i.first==2)betu_cnt--;if(i.first==2&&i.second==to_string(kind)&&betu_cnt<0){rep(j,bakudan_saigo_cnt){cout<<i.first<<" "<<i.second<<endl;bakudan_saigo_cnt--;}}}}