Submission #385509

# Submission time Handle Problem Language Result Execution time Memory
385509 2021-04-04T13:56:19 Z ogibogi2004 Robots (APIO13_robots) C++14
30 / 100
526 ms 73892 KB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("O3")
#pragma GCC target ("fma,avx,avx2")
#define ends dfdsfdsf
const int INF=1e8;
pair<pair<short,short>,char> nxt[512][512][4];
vector<pair<pair<short,short>,char> >g[512][512][4];
vector<pair<short,short> >g1[512][512];
char table[512][512];
short r,n,m;
vector<pair<pair<short,short>,char> >ends;
pair<pair<short,short>,char> actual_nxt[512][512][4];
bool not_valid(pair<int,int> p)
{
	int x=p.first,y=p.second;
	if(x<1||y<1||x>n||y>m)return 1;
	return table[x][y]=='x';
}
int dp[45][512][512];
pair<int,int> where[10];
int number[10][10];
int c(int x,int y)
{
	return number[x][y];
}
void pre()
{
	int cnt=0;
	for(int i=1;i<=9;++i)
	{
		for(int j=i;j<=9;++j)
		{
			number[i][j]=++cnt;
		}
	}
}
int main()
{
	pre();
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>r>>m>>n;
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			cin>>table[i][j];
			if(isdigit(table[i][j]))
			{
				where[table[i][j]-'0']={i,j};
			}
		}
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			if(table[i][j]=='x')continue;
			if(table[i][j]=='A')
			{
				nxt[i][j][0]={{i,j-1},3};
				nxt[i][j][1]={{i-1,j},0};
				nxt[i][j][2]={{i,j+1},1};
				nxt[i][j][3]={{i+1,j},2};
			}
			else if(table[i][j]=='C')
			{
				nxt[i][j][0]={{i,j+1},1};
				nxt[i][j][1]={{i+1,j},2};
				nxt[i][j][2]={{i,j-1},3};
				nxt[i][j][3]={{i-1,j},0};
			}
			else
			{
				nxt[i][j][0]={{i-1,j},0};
				nxt[i][j][1]={{i,j+1},1};
				nxt[i][j][2]={{i+1,j},2};
				nxt[i][j][3]={{i,j-1},3};
			}
			for(int l=0;l<4;++l)
			{
				if(not_valid(nxt[i][j][l].first))
				{
					ends.push_back({{i,j},l});
				}
				g[nxt[i][j][l].first.first][nxt[i][j][l].first.second][nxt[i][j][l].second].push_back({{i,j},l});
			}
		}
	}
	queue<pair<pair<short,short>,char> >qq;
	for(auto xd:ends)
	{
		qq.push(xd);
		actual_nxt[xd.first.first][xd.first.second][xd.second]=xd;
	}
	while(!qq.empty())
	{
		auto u=qq.front();
		qq.pop();
		for(auto xd:g[u.first.first][u.first.second][u.second])
		{
			actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
			qq.push(xd);
		}
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			for(int l=0;l<4;++l)
			{
				int x,y,z;
				x=actual_nxt[i][j][l].first.first;
				y=actual_nxt[i][j][l].first.second;
				z=actual_nxt[i][j][l].second;
				if(x==i&&y==j&&z==l)continue;
				g1[i][j].push_back({x,y});
			}
		}
	}
	for(int r1=1;r1<=r;++r1)
	{
		for(int r2=1;r2<=r;++r2)
		{
			for(int i1=1;i1<=n;++i1)
			{
				for(int i2=1;i2<=m;++i2)
				{
					dp[c(r1,r2)][i1][i2]=INF;
				}
			}
		}
	}
	queue<pair<short,short> >q;
	for(int i=1;i<=r;++i)
	{
		short x,y;
		x=where[i].first;
		y=where[i].second;
		q.push({x,y});
		dp[c(i,i)][x][y]=0;
		while(!q.empty())
		{
			tie(x,y)=q.front();
			q.pop();
			for(auto xd:g1[x][y])
			{
				if(dp[c(i,i)][xd.first][xd.second]>dp[c(i,i)][x][y]+1)
				{
					dp[c(i,i)][xd.first][xd.second]=dp[c(i,i)][x][y]+1;
					q.push(xd);
				}
			}
		}
	}
	priority_queue<pair<int,pair<short,short> > >pq;
	for(short len=2;len<=r;++len)
	{
		for(short r1=1;r1+len-1<=r;++r1)
		{
			short r2=r1+len-1;
			short cc=c(r1,r2);
			for(short mid=r1;mid<r2;++mid)
			{
				for(short i=1;i<=n;++i)
				{
					for(short j=1;j<=m;++j)
					{
						dp[cc][i][j]=min(dp[cc][i][j],dp[c(r1,mid)][i][j]+dp[c(mid+1,r2)][i][j]);
					}
				}
			}
			for(short i=1;i<=n;++i)
			{
				for(short j=1;j<=m;++j)
				{
					if(dp[cc][i][j]<INF)pq.push({-dp[cc][i][j],{i,j}});
				}
			}
			while(!pq.empty())
			{
				short x,y;
				short t;
				t=pq.top().first;
				tie(x,y)=pq.top().second;
				pq.pop();
				if(t!=-dp[cc][x][y])continue;
				for(auto xd:g1[x][y])
				{
					if(dp[cc][x][y]+1<dp[cc][xd.first][xd.second])
					{
						dp[cc][xd.first][xd.second]=dp[cc][x][y]+1;
						pq.push({-dp[cc][xd.first][xd.second],{xd}});
					}
				}
			}
		}
	}
	/*for(int i1=1;i1<=r;i1++)
	{
		for(int i2=i1;i2<=r;i2++)
		{
			cout<<i1<<"-"<<i2<<endl;
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=m;j++)
				{
					if(dp[i1][i2][i][j]<INF)cout<<dp[i1][i2][i][j];
					else cout<<"x";
				}
				cout<<endl;
			}
		}
	}*/
	int ans=INF;
	for(short i=1;i<=n;++i)
	{
		for(short j=1;j<=m;++j)
		{
			ans=min(ans,dp[c(1,r)][i][j]);
		}
	}
	if(ans==INF)cout<<"-1\n";
	else 
	{
		cout<<ans<<endl;
	}
return 0;
}

Compilation message

robots.cpp: In function 'int main()':
robots.cpp:88:73: warning: array subscript has type 'char' [-Wchar-subscripts]
   88 |     g[nxt[i][j][l].first.first][nxt[i][j][l].first.second][nxt[i][j][l].second].push_back({{i,j},l});
      |                                                            ~~~~~~~~~~~~~^~~~~~
robots.cpp:96:50: warning: array subscript has type 'char' [-Wchar-subscripts]
   96 |   actual_nxt[xd.first.first][xd.first.second][xd.second]=xd;
      |                                               ~~~^~~~~~
robots.cpp:102:50: warning: array subscript has type 'char' [-Wchar-subscripts]
  102 |   for(auto xd:g[u.first.first][u.first.second][u.second])
      |                                                ~~^~~~~~
robots.cpp:104:51: warning: array subscript has type 'char' [-Wchar-subscripts]
  104 |    actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
      |                                                ~~~^~~~~~
robots.cpp:104:103: warning: array subscript has type 'char' [-Wchar-subscripts]
  104 |    actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
      |                                                                                                     ~~^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
6 Correct 22 ms 31212 KB Output is correct
7 Correct 25 ms 31212 KB Output is correct
8 Correct 23 ms 31212 KB Output is correct
9 Correct 22 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
6 Correct 22 ms 31212 KB Output is correct
7 Correct 25 ms 31212 KB Output is correct
8 Correct 23 ms 31212 KB Output is correct
9 Correct 22 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
11 Correct 178 ms 73508 KB Output is correct
12 Correct 71 ms 46648 KB Output is correct
13 Correct 82 ms 65088 KB Output is correct
14 Incorrect 526 ms 73892 KB Output isn't correct
15 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 22 ms 31212 KB Output is correct
4 Correct 22 ms 31340 KB Output is correct
5 Correct 22 ms 31340 KB Output is correct
6 Correct 22 ms 31212 KB Output is correct
7 Correct 25 ms 31212 KB Output is correct
8 Correct 23 ms 31212 KB Output is correct
9 Correct 22 ms 31212 KB Output is correct
10 Correct 22 ms 31340 KB Output is correct
11 Correct 178 ms 73508 KB Output is correct
12 Correct 71 ms 46648 KB Output is correct
13 Correct 82 ms 65088 KB Output is correct
14 Incorrect 526 ms 73892 KB Output isn't correct
15 Halted 0 ms 0 KB -