他
【问题描述】
一张长度为的纸带,我们可以从左至右编号为(纸带最左端标号为)。现在有次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少。
【输入格式】
第一行两个数字如题意所述。
接下来一行个整数代表每次折叠的位置。
【输出格式】
一行一个整数代表答案。
【样例输入】
5 2
3 5
【样例输出】
2
【样例解释】
树上有只鸟。
【数据规模与约定】
对于60%的数据,N,M<=3000。
对于100%的数据,N<=10^18,M<=3000。
题解:每次折叠时,更新纸带的左右端点,以及这次折叠之后折叠位置的编号。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define N 3100 #define ll long long using namespace std; int m; ll n,l(0),r; ll a[N]; int main() { freopen("he.in","r",stdin); freopen("he.out","w",stdout); cin>>n>>m; r=n; for (int i=1;i<=m;i++) cin>>a[i]; for (int i=1;i<=m;i++) { if (a[i]*2>=l+r) r=a[i];//更新端点 else l=a[i]; for (int j=i+1;j<=m;j++)//更新位置 { if (a[j]<l) a[j]=l*2-a[j]; if (a[j]>r) a[j]=r*2-a[j]; } } cout<<r-l<<endl; fclose(stdin); fclose(stdout); return 0; }