机房测试模拟2:模拟+数学+数位dp
T1: 分析: 画图模拟,发现折叠后的长度会变成折叠位置左右两部分取max,难点在于:折叠后找不到对应的点在哪个位置。 因为n很大,但其实很多位置都是用不到的,所以处理m个操作。 一次操作后,可能会影响到后面的所有操作的位置,于是将操作离线,一次操作后将后面所有将要用到的操作位置都更新。 怎么更新? 例如:1 2 3 4 5 6 7 8 现在折3,下一步折8,8应该变成abs(3-8)=5 因为相当于将节点重新标号了: 1 2 3 4 5 6 7 8 / / 0 1 2 3 4 5(被翻过的位置不会再有了) 然后长度又被更新成:len=max(len-a[i],a[i]) (相比起来这种神奇又巧妙的方法 ssw的模拟 好理解多了) #include<bits/stdc++.h> using namespace std; #define ll long long #define ri register int #define N 3005 ll a[N]; int main() { freopen("fold.in","r",stdin); freopen("fold.out","w",stdout); ll n; int m; scanf("%lld%d",&n,&m); ll len=n; for(ri i=1;i<=m;++i) scanf("%lld",&a[i]); for