답안 #292938

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
292938 2020-09-07T14:53:43 Z arnold518 Spring cleaning (CEOI20_cleaning) C++14
0 / 100
1000 ms 262148 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1000;
const ll MOD = 1e9+7;

int R, C, Q;
pll dp1[MAXN+10][MAXN+10], dp2[MAXN+10][MAXN+10], dp3[MAXN+10][MAXN+10];

typedef vector<vector<ll>> Mat;

Mat operator * (const Mat &p, const Mat &q)
{
	Mat ret=vector<vector<ll>>(p.size(), vector<ll>(q[0].size()));
	assert(p[0].size()==q.size());
	for(int i=0; i<p.size(); i++) for(int j=0; j<q[0].size(); j++)
	{
		for(int k=0; k<q.size(); k++)
		{
			ret[i][j]+=p[i][k]*q[k][j]%MOD;
			ret[i][j]%=MOD;
		}
	}
	return ret;
}

Mat Matpow(Mat x, ll y)
{
	if(y==1) return x;
	if(y%2) return x*Matpow(x, y-1);
	Mat t=Matpow(x, y/2);
	return t*t;
}

pll operator + (const pll &p, const pll &q)
{
	if(p.first==q.first) return {p.first, (p.second+q.second)%MOD};
	return min(p, q);
}

int main()
{
	scanf("%d%d%d", &R, &C, &Q);
	Mat p=vector<vector<ll>>(C, vector<ll>(C));
	for(int i=0; i<C; i++)
	{
		if(i!=0) p[i][i-1]=1;
		p[i][i]=1;
		if(i!=C-1) p[i][i+1]=1;
	}
	Mat q=p;
	bool flag=false;		

	while(Q--)
	{
		char c; int a, b;
		scanf(" %c%d%d", &c, &a, &b);
		if(c=='P')
		{
			if(a==b) printf("%d 1\n", R-1);
			else printf("0 0\n");
		}
		else if(c=='R')
		{
			if(a==b) printf("1 1\n");
			else printf("2 2\n");
		}
		else if(c=='Q')
		{
			if(a==b) printf("1 1\n");
			else if(abs(a-b)==R-1) printf("1 1\n");
			else
			{
				vector<pii> V;
				V.push_back({R, a-(R-1)});
				V.push_back({R, a});
				V.push_back({R, a+(R-1)});
				V.push_back({1, b-(R-1)});
				V.push_back({1, b});
				V.push_back({1, b+(R-1)});

				V.push_back({b+R-a, a});
				V.push_back({R-b+a, a});

				if((R-b+a+1)%2==0) V.push_back({(R-b+a+1)/2, (a+1-R+b)/2});
				V.push_back({a+1-b, b});

				V.push_back({1-a+b, b});
				if((b+R+1-a)%2==0) V.push_back({(b+R+1-a)/2, (b+R-1+a)/2});

				int ans=0;
				for(auto it : V) if(1<=it.first && it.first<=R && 1<=it.second && it.second<=C) ans++;
				printf("2 %d\n", ans);
			}
		}
		else if(c=='B')
		{
			if((a+1)%2!=(b+R)%2) printf("0 0\n");
			else if(abs(a-b)==R-1) printf("1 1\n");
			else
			{
				int lo=1, hi=1e9;
				while(lo+1<hi)
				{
					int mid=lo+hi>>1;
					bool flag=false;
					if(mid%2==0)
					{
						if(2-a+(ll)(C-1)*mid>=b+R) flag=true;
						if(a-1+(ll)(mid-2)*(C-1)>=R-b) flag=true;
					}
					else
					{
						if(a-C+(ll)mid*(C-1)>=b+R) flag=true;	
						if(1-a+(ll)(mid-2)*(C-1)>=R-b) flag=true;
					}
					if(flag) hi=mid;
					else lo=mid;
				}

				for(int i=1; i<=C; i++)
				{
					dp1[1][i]={987654321, 0};
					dp2[1][i]={987654321, 0};
					dp3[1][i]={987654321, 0};
				}
				dp1[1][a]={0, 1};
				dp2[1][a]={0, 1};
				dp3[1][a]={0, 1};

				for(int i=2; i<=R; i++)
				{
					for(int j=1; j<=C; j++)
					{
						dp1[i][j]={987654321, 0};
						if(j!=1) dp1[i][j]=dp1[i][j]+pll(dp2[i-1][j-1].first+1, dp2[i-1][j-1].second);
						if(j!=C) dp1[i][j]=dp1[i][j]+pll(dp3[i-1][j+1].first+1, dp3[i-1][j+1].second);
						dp2[i][j]=dp3[i][j]=dp1[i][j];
						if(j!=1) dp2[i][j]=dp2[i][j]+dp2[i-1][j-1];
						if(j!=C) dp3[i][j]=dp3[i][j]+dp3[i-1][j+1];
						printf("%3lld ", dp1[i][j].second);
					}
					printf("\n");
				}
				printf("%lld %lld\n", dp1[R][b].first, dp1[R][b].second);
			}
		}
		else
		{
			if(!flag)
			{
				flag=true;
				p=Matpow(p, R-1);
			}
			printf("%d %lld\n", R-1, p[a-1][b-1]);
		}
	}
}

Compilation message

cleaning.cpp: In function 'Mat operator*(const Mat&, const Mat&)':
cleaning.cpp:20:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |  for(int i=0; i<p.size(); i++) for(int j=0; j<q[0].size(); j++)
      |               ~^~~~~~~~~
cleaning.cpp:20:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |  for(int i=0; i<p.size(); i++) for(int j=0; j<q[0].size(); j++)
      |                                             ~^~~~~~~~~~~~
cleaning.cpp:22:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |   for(int k=0; k<q.size(); k++)
      |                ~^~~~~~~~~
cleaning.cpp: In function 'int main()':
cleaning.cpp:109:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  109 |      int mid=lo+hi>>1;
      |              ~~^~~
cleaning.cpp:47:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   47 |  scanf("%d%d%d", &R, &C, &Q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
cleaning.cpp:61:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   61 |   scanf(" %c%d%d", &c, &a, &b);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4 ms 384 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 384 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1062 ms 19064 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 164 ms 262148 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 170 ms 262148 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Output isn't correct
2 Halted 0 ms 0 KB -