bzoj 3043 (差分序列运用)
维护差分序列 显然要使差分序列的后n-1位为0 对于原来的区间操作 只需要单点修改或者两个点修改 就转化成了 对于差分序列但以一个数+1 或 -1 或者一个+1同时一个-1 ans1=max(sum1,sum2)sum1=Σbi(bi>0)sum2=absΣ(bi<0) 求方案数的话嘛 也就是不同的b1 只有+1 或 -1的操作才可能影响到b1 这里并不是只有-1才会影响到b1 操作前半段+1和操作后半段-1是等效的 也就是说 前半段+1 会导致单点-1 后半段-1也会导致单点-1 是一样滴 现在搞出所有的单点操作就ok了 所有操作 - 两个点的操作 ans1=max(sum1,sum2)-min(sum1,sum2)+1 #include<cstdio> #include<cstring> #include<iostream> #define maxn 200010 #define ll long long using namespace std; ll n,a[maxn],b[maxn],ans1,ans2; ll init() { ll x=0;char s=getchar(); while(s<'0'||s>'9')s=getchar(); while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x; } int main() { n=init(); for(int i=1;i<=n;i++) a[i]=init(); for(int i=1;i<=n;i++) b[i]=a[i]-a[i-1]; ll s1=0,s2=0; for(int i=2;i<=n;i++) if(b[i]>0)s1+=b[i]; else s2-=b[i]; ans1=max(s1,s2); ans2=max(s1,s2)-min(s1,s2)+1; cout<<ans1<<endl<<ans2<<endl; return 0; }