【校内测】千纸鹤

  • Post author:
  • Post category:其他




【校内测】千纸鹤



题目

原题来自:CF

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述




解题思路

其实暴力模拟操作是有70的

但是我当时懒得想,然后没打。。。

翻折次数越多,长度就会越多

要解决的就是如果对折点超过长度的一半,时间花费太多

可以转变为翻转后再翻折,那折的长度就变短了

打标价是否翻转了,确定当前的翻折点

PS 数组存的是区间,而不是坐标,例x=3,那么应该是将3翻到4那




程序

#include<iostream>
#include<cstring> 
#include<cstdio>
using namespace std;
int n,m,op,x,k,l,r,fla,a[10000100];
int main()
{
	freopen("paper.in","r",stdin);
	freopen("paper.out","w",stdout);
	scanf("%d%d",&n,&m);
	r=n;
    for (int i=0;i<n;i++) a[i]=1;
	for (int i=1;i<=m;i++) 
	{
		scanf("%d%d",&op,&x);
		if (op) 
		{
		   if (fla) x=r-l-x-1;
		   printf("%d\n",a[l+x]);
		   continue;
	    }
	    else {
	       if (fla) x=r-l-x;
	       if (x*2>r-l)
	       {
	       	  fla=1;  //标记翻转
	       	  for (int i=0;i<r-l-x;i++)
	       	      a[l+x-i-1]+=a[l+x+i];  //从右往左折
	       	  r=l+x;
		   }
		   else 
		   {
		   	  fla=0;  //没有翻转,去标记
		      for (int i=0;i<x;i++)
		          a[l+x+i]+=a[l+x-i-1];
			  l=l+x;
		   }
	    }
	}
	return 0;
}



版权声明:本文为qq_45621109原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。