【BZOJ 3043】 3043: IncDec Sequence (差分)
3043: IncDec Sequence
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 589 Solved: 332Description
给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。
问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。Input
第一行一个正整数n
接下来n行,每行一个整数,第i+1行的整数表示ai。
。Output
第一行输出最少操作次数
第二行输出最终能得到多少种结果Sample Input
4
1
1
2
2
Sample Output
1
2
HINT
对于100%的数据,n=100000,0<=ai<2147483648
Source
【分析】
脑子真的是越来越屎了。。
膜了一下wohenshuai。。
差分,就是-1和+1,-1,+1操作,要全部变成0,显然第一问是max(正数和,负数和)[绝对值]
第二问是正值和与负值和[绝对值]差值+1,因为剩下那个数自己消的情况下也可以和1一起消。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define LL long long 8 #define Maxn 100010 9 10 LL a[Maxn],ss[Maxn]; 11 12 int main() 13 { 14 int n; 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++) scanf("%lld",&a[i]); 17 for(int i=2;i<=n;i++) ss[i]=a[i]-a[i-1]; 18 LL a1=0,a2=0; 19 for(int i=1;i<=n;i++) if(ss[i]>0) a1+=ss[i]; 20 else a2+=-ss[i]; 21 printf("%lld\n%lld\n",max(a1,a2),abs(a1-a2)+1); 22 return 0; 23 }
2017-04-11 21:12:14