标签:扫描法
1.题目描述:点击打开链接
2.解题思路:本题利用扫描法解决。根据题意描述,[L,i)和[i,R)区间都构成了等差数列,因此可以实现用L[i],R[i]来维护从i开始向左向右可以延伸的最远长度,如果d1和d2不等,那么答案就是L[i]*R[i]求和,否则就是R[i]求和。
3.代码:
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorithm> #include<cassert> #include<string> #include<sstream> #include<set> #include<bitset> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<cctype> #include<functional> using namespace std; #define me(s) memset(s,0,sizeof(s)) typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair <int, int> P; const int N=100000+10; int L[N],R[N]; int a[N]; int n,d1,d2; int main() { while(~scanf("%d%d%d",&n,&d1,&d2)) { for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) { if(i==0||a[i-1]+d1!=a[i])L[i]=1; else L[i]=L[i-1]+1; } for(int i=n-1;i>=0;i--) { if(i==n-1||a[i]+d2!=a[i+1])R[i]=1; else R[i]=R[i+1]+1; } ll ans=0; if(d1!=d2) { for(int i=0;i<n;i++) ans+=(ll)L[i]*R[i]; } else { for(int i=0;i<n;i++) ans+=R[i]; } printf("%I64d\n",ans); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 5400 Arithmetic Sequence (2015年多校比赛第9场)
标签:扫描法
原文地址:http://blog.csdn.net/u014800748/article/details/47761463