bzoj3043 IncDec Sequence
2018-01-28 22:39
597 查看
Description
给定一个长度为n的数列{a1,a2…an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。
对于100%的数据,n=100000,0<=ai<2147483648
Solution
一个很naive的想法是三分一个最终结果,但是发现这样做不出第二问考虑差分这个a。我们的目的是使得差分数组c中2~n位都为0,想到修改[l,r]实际上是修改l和r+1,答案实际上是正数和与负数和绝对值中较小辣个
由于经过变换后的数列只取决于c1,观察可发现c1只在处理剩余的正数时被改变了,第二问答案就是abs(pos-neg)+1
Code
#include <stdio.h> #include <algorithm> #define rep(i,st,ed) for (int i=st;i<=ed;++i) using namespace std; typedef long long LL; const int N=100005; LL a ,c ; int main(void) { LL n,q=0,p=0; scanf("%lld",&n); rep(i,1,n) scanf("%lld",&a[i]); rep(i,1,n) c[i]=a[i]-a[i-1]; rep(i,2,n) q+=(c[i]>0)*c[i]; rep(i,2,n) p+=-(c[i]<0)*c[i]; printf("%lld\n%lld\n", max(p,q),abs(p-q)+1); return 0; }
相关文章推荐
- 【BZOJ 3043】 3043: IncDec Sequence (差分)
- BZOJ系列3043《IncDec Sequence》题解
- bzoj 3043: IncDec Sequence 差分
- 差分【bzoj3043】IncDec Sequence
- [BZOJ3043] IncDec Sequence
- [BZOJ 3043]IncDec Sequence
- bzoj 3043 wikioi 2498 IncDec Sequence
- 【BZOJ3043】IncDec Sequence
- BZOJ 3043: IncDec Sequence
- 【BZOJ3043】IncDec Sequence 乱搞
- bzoj 3043: IncDec Sequence 模拟
- BZOJ 3043 IncDec Sequence 差分
- 3043: IncDec Sequence
- 3043: IncDec Sequence (中位数)
- 【BZOJ】【P3043】【IncDec Sequence】【题解】【差分】
- 3043: IncDec Sequence
- IncDec Sequence(codevs 2098)
- IncDec Sequence
- 洛谷 P4552 [Poetize6] IncDec Sequence【差分+脑洞】
- CODEVS P2498 IncDec Sequence