Submission #385550

# Submission time Handle Problem Language Result Execution time Memory
385550 2021-04-04T15:03:56 Z ogibogi2004 Robots (APIO13_robots) C++14
60 / 100
353 ms 163844 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[502][502][4];
vector<pair<pair<short,short>,char> >g[502][502][4];
vector<pair<short,short> >g1[502][502];
char table[502][502];
short r,n,m;
vector<pair<pair<short,short>,char> >ends;
pair<pair<short,short>,char> actual_nxt[502][502][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][502][502];
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;
		}
	}
}
vector<pair<int,int> >pq[2000000];
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);
				}
			}
		}
	}
	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]);
					}
				}
			}
			int mindp=INF;
			vector<int>dps;
			for(int i=1;i<=n;++i)
			{
				for(int j=1;j<=m;++j)
				{
					mindp=min(mindp,dp[c(r1,r2)][i][j]);
					if(dp[c(r1,r2)][i][j]<INF)
					{
						pq[dp[c(r1,r2)][i][j]].push_back({i,j});
						dps.push_back(dp[c(r1,r2)][i][j]);
					}
				}
			}
			queue<pair<int,int> >qqq;
			if(mindp<INF)
			{
				for(auto xd:pq[mindp])qqq.push({xd.first,xd.second});
				pq[mindp].clear();
			}
			while(!qqq.empty())
			{
				int x,y;
				tie(x,y)=qqq.front();
				qqq.pop();
				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;
						qqq.push(xd);
					}
				}
				if(dp[c(r1,r2)][x][y]+1<INF&&pq[dp[c(r1,r2)][x][y]+1].size()!=0)
				{
					for(auto xd:pq[dp[c(r1,r2)][x][y]+1])
					{
						if(dp[c(r1,r2)][xd.first][xd.second]!=dp[c(r1,r2)][x][y]+1)continue;
						qqq.push(xd);
					}
					pq[dp[c(r1,r2)][x][y]+1].clear();
				}
			}
			for(auto xd:dps)pq[xd].clear();
		}
	}
	/*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:89:73: warning: array subscript has type 'char' [-Wchar-subscripts]
   89 |     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:97:50: warning: array subscript has type 'char' [-Wchar-subscripts]
   97 |   actual_nxt[xd.first.first][xd.first.second][xd.second]=xd;
      |                                               ~~~^~~~~~
robots.cpp:103:50: warning: array subscript has type 'char' [-Wchar-subscripts]
  103 |   for(auto xd:g[u.first.first][u.first.second][u.second])
      |                                                ~~^~~~~~
robots.cpp:105:51: warning: array subscript has type 'char' [-Wchar-subscripts]
  105 |    actual_nxt[xd.first.first][xd.first.second][xd.second]=actual_nxt[u.first.first][u.first.second][u.second];
      |                                                ~~~^~~~~~
robots.cpp:105:103: warning: array subscript has type 'char' [-Wchar-subscripts]
  105 |    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 53 ms 76908 KB Output is correct
2 Correct 53 ms 76908 KB Output is correct
3 Correct 53 ms 76908 KB Output is correct
4 Correct 53 ms 77164 KB Output is correct
5 Correct 55 ms 77164 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 53 ms 76908 KB Output is correct
2 Correct 53 ms 76908 KB Output is correct
3 Correct 53 ms 76908 KB Output is correct
4 Correct 53 ms 77164 KB Output is correct
5 Correct 55 ms 77164 KB Output is correct
6 Correct 53 ms 76908 KB Output is correct
7 Correct 54 ms 76908 KB Output is correct
8 Correct 54 ms 77056 KB Output is correct
9 Correct 53 ms 76908 KB Output is correct
10 Correct 59 ms 77200 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 53 ms 76908 KB Output is correct
2 Correct 53 ms 76908 KB Output is correct
3 Correct 53 ms 76908 KB Output is correct
4 Correct 53 ms 77164 KB Output is correct
5 Correct 55 ms 77164 KB Output is correct
6 Correct 53 ms 76908 KB Output is correct
7 Correct 54 ms 76908 KB Output is correct
8 Correct 54 ms 77056 KB Output is correct
9 Correct 53 ms 76908 KB Output is correct
10 Correct 59 ms 77200 KB Output is correct
11 Correct 152 ms 121508 KB Output is correct
12 Correct 88 ms 91940 KB Output is correct
13 Correct 106 ms 110116 KB Output is correct
14 Correct 230 ms 124196 KB Output is correct
15 Correct 134 ms 119076 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 53 ms 76908 KB Output is correct
2 Correct 53 ms 76908 KB Output is correct
3 Correct 53 ms 76908 KB Output is correct
4 Correct 53 ms 77164 KB Output is correct
5 Correct 55 ms 77164 KB Output is correct
6 Correct 53 ms 76908 KB Output is correct
7 Correct 54 ms 76908 KB Output is correct
8 Correct 54 ms 77056 KB Output is correct
9 Correct 53 ms 76908 KB Output is correct
10 Correct 59 ms 77200 KB Output is correct
11 Correct 152 ms 121508 KB Output is correct
12 Correct 88 ms 91940 KB Output is correct
13 Correct 106 ms 110116 KB Output is correct
14 Correct 230 ms 124196 KB Output is correct
15 Correct 134 ms 119076 KB Output is correct
16 Runtime error 353 ms 163844 KB Execution killed with signal 9
17 Halted 0 ms 0 KB -