C. Helping the Nature #802 div2
作者:互联网
这个题说实话看完题目第一眼反应的就是差分,还是不擅长英文题目吗?当时一个劲的翻译,翻译完只是了解了一下题目意思,把重要信息都漏了,还是要多多注意一下
连续的某一段同时+d或者-d,这首先就应该要想到差分,然后差分数组构造出来之后,因为最后统统变成0,所以连同b[1]也要变成0
那具体怎么变呢
根据题意:
操作1:d[1]-1 d[i+1]+1
操作2:d[i]-1 d[n+1]+1
操作3:d[1]+1 d[n+1]-1
差分数组说实话b[n+1]这个可以随便用,前面的都是0即可
所以,到这里还不会吗?我还真不会QAQ
举个栗子:
10 4 7
10 -6 3
从后往前枚举,这样不会有影响,3—>0,必定是减3,可以进行操作2(对后缀进行操作),然后在总次数上+3
-6—>0 需要+6,这是某一前缀啊,可以是操作1,不过这里的b[1]要进行变化(其实操作几都可以,我们需要选一个最优的)
然后到最后了b[1]要变成0,所以总次数+abs(b[1])就是答案了
#include<iostream> #include<cstdio> using namespace std; const int N=2e5+10; typedef long long ll; ll a[N],b[N]; int main(){ int T; cin>>T; while(T--) { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]-a[i-1]; } ll sum=0; for(int i=n;i>=2;i--) { if(b[i]>0) sum+=b[i]; else if(b[i]<0) { sum-=b[i]; b[1]+=b[i]; } } cout<<abs(b[1])+sum<<"\n"; } return 0; }
标签:10,题目,int,ll,差分,Helping,操作,802,div2 来源: https://www.cnblogs.com/ccwz7/p/16395951.html