标签:10 题目 int ll 差分 Helping 操作 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。