CF - 사고력 - div2-564-C. Nauuo and Cards

제목 전송문 Official Tutorial: First, try to finish it without playing any empty cards.
If that’s not possible, the best choice is to play several empty cards in a row, then play from 1 to n. For a card i, suppose that it is in the pi-th position in the pile (pi=0 if it is in the hand), you have to play at least pi−i+1 empty cards. So the answer will be max{pi−i+1+n}.
My Thoughts: 문제풀이와 결합하여 자신의 이해를 이야기해 보세요.왜 1이 b에 있거나 b에 있지 않은 것으로 나뉘어야 합니까? 왜냐하면 1이 b에 있을 경우 구성될 수 있기 때문입니다...하나, 둘, 셋, 이럴 때는 몇 가지 절차를 생략할 수 있다.기타 상황.왜 이렇습니까? 만약에 1이 이 특수한 조건(1이 b안에 없는 것 포함)을 만족시키지 못하면 모든 p[i]를 i의 앞(p[i]n이 순환을 벗어나면 답을 출력한다.
#include
#define per(i,a,b) for(int i = (a);i <= (b);++i)
#define rep(i,a,b) for(int i = (a);i >= (b);--i)
using namespace std;
const int maxn = 2e5;

int a[maxn+10],b[maxn+10];
int p[maxn+10];
int n = 0;
void solve(){
	/*
	    ,          。
	     1 b   b      ,    1 b     。。。。。1 2 3,        
	    。    。       ,  1         (  1  b  ),      
	p[i] i   (p[i] < i),       max(p[i]-i+1),          1-n,    
	     ,      i ,i           a  ,  +n;            ,
	 b  1      。

	  :  b             ,     ( 1)          。       
	      。          1 b      


	  1 b ,     ,    。。。。。1 2 3
	            ,         p[j] <= j - (i+1),      j  ,    
	    , j > n    ,     。
	*/
	if(p[1]){
		for(int i = 1;p[i] == p[1] + i - 1;++i){
			if(p[i] == n){
				int j = 0;
				for(j = i+1;j <= n && p[j] <= j - (i+1);++j);
				if(j > n){
					printf("%d
"
,n-i); return ; } } } } int ans = 0; per(i,1,n){ ans = max(ans,p[i]-i+1 + n); } printf("%d
"
,ans); } int main(){ while(~scanf("%d",&n)){ memset(p,0,sizeof(p)); per(i,1,n){ scanf("%d",&a[i]); } per(i,1,n){ scanf("%d",&b[i]); p[b[i]] = i; } solve(); } return 0; }

좋은 웹페이지 즐겨찾기