Submission #385498

# Submission time Handle Problem Language Result Execution time Memory
385498 2021-04-04T13:42:53 Z ogibogi2004 Robots (APIO13_robots) C++14
60 / 100
1500 ms 127172 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(int len=2;len<=r;++len)
	{
		for(int r1=1;r1+len-1<=r;++r1)
		{
			int r2=r1+len-1;
			for(int mid=r1;mid<r2;++mid)
			{
				for(int i=1;i<=n;++i)
				{
					for(int j=1;j<=m;++j)
					{
						dp[c(r1,r2)][i][j]=min(dp[c(r1,r2)][i][j],dp[c(r1,mid)][i][j]+dp[c(mid+1,r2)][i][j]);
					}
				}
			}
			for(int i=1;i<=n;++i)
			{
				for(int j=1;j<=m;++j)
				{
					if(dp[c(r1,r2)][i][j]<INF)pq.push({-dp[c(r1,r2)][i][j],{i,j}});
				}
			}
			while(!pq.empty())
			{
				int x,y;
				int t;
				t=pq.top().first;
				tie(x,y)=pq.top().second;
				pq.pop();
				if(t!=-dp[c(r1,r2)][x][y])continue;
				for(auto xd:g1[x][y])
				{
					if(dp[c(r1,r2)][x][y]+1<dp[c(r1,r2)][xd.first][xd.second])
					{
						dp[c(r1,r2)][xd.first][xd.second]=dp[c(r1,r2)][x][y]+1;
						pq.push({-dp[c(r1,r2)][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(int i=1;i<=n;++i)
	{
		for(int 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 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 23 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 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 23 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 22 ms 31212 KB Output is correct
8 Correct 21 ms 31212 KB Output is correct
9 Correct 21 ms 31212 KB Output is correct
10 Correct 23 ms 31340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 23 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 22 ms 31212 KB Output is correct
8 Correct 21 ms 31212 KB Output is correct
9 Correct 21 ms 31212 KB Output is correct
10 Correct 23 ms 31340 KB Output is correct
11 Correct 183 ms 73380 KB Output is correct
12 Correct 57 ms 46500 KB Output is correct
13 Correct 74 ms 65060 KB Output is correct
14 Correct 616 ms 73892 KB Output is correct
15 Correct 131 ms 73124 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 31212 KB Output is correct
2 Correct 22 ms 31212 KB Output is correct
3 Correct 23 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 22 ms 31212 KB Output is correct
8 Correct 21 ms 31212 KB Output is correct
9 Correct 21 ms 31212 KB Output is correct
10 Correct 23 ms 31340 KB Output is correct
11 Correct 183 ms 73380 KB Output is correct
12 Correct 57 ms 46500 KB Output is correct
13 Correct 74 ms 65060 KB Output is correct
14 Correct 616 ms 73892 KB Output is correct
15 Correct 131 ms 73124 KB Output is correct
16 Correct 367 ms 127172 KB Output is correct
17 Execution timed out 1587 ms 114464 KB Time limit exceeded
18 Halted 0 ms 0 KB -