多校第九场Arithmetic Sequence题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5400

题意:给定等差数列的差值d1,d2,问长度为n的数列中有多少个满足条件的子序列,条件为子序列中存在一个xi满足前半段是差值为d1的等差数列,后半段是差值为d2的等差数列

思路:

首先预处理出来出ii这个位置向前d_1d?1??的等差序列和向后d_2d?2??的等差数列能延续到多长,记作l_i,r_il?i??,r?i??。

如果d_1\neq
d_2d?1??≠d?2??,那么枚举中间位置,答案为l_i*r_il?i???r?i??。

如果d_1=d_2d?1??=d?2??,枚举开始位置,答案为r_ir?i??。

代码:

#include <cstdlib>

#include <cctype>

#include <cstring>

#include <cstdio>

#include <cmath>

#include <algorithm>

#include <vector>

#include <string>

#include <iostream>

#include <sstream>

#include <map>

#include <set>

#include <queue>

#include <stack>

#include <fstream>

#include <numeric>

#include <iomanip>

#include <bitset>

#include <list>

#include <stdexcept>

#include <functional>

#include <utility>

#include <ctime>

#include <cassert>

#include <complex>

using namespace std;

#define ll long long

const int N=101000;

int n,d1,d2,a[N],l[N],r[N];

ll ans;

int main()

{

while (scanf("%d%d%d",&n,&d1,&d2)!=EOF)

{

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;

}

ans=0;

for(int i=0; i<n; i++)

{

if (d1!=d2)

ans+=(ll)l[i]*r[i];

else

ans+=r[i];

}

printf("%lld\n",ans);

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 01:21:03

多校第九场Arithmetic Sequence题解的相关文章

多校第九场Too Simple题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5399 题意:给你m个映射,每个自变量x,对应一个f(x),这m个映射中有某一些已知的,给出你从1到n对应的映射值,剩下的一些不知道映射关系的,给你-1,要求找出符合条件的映射组合有多少组,其中要求是:对于i从1到n都满足f1(f2(--fm(i)))=i 思路:开个脑洞发现:如果-1的个数不止一个,那么只有最后一个-1所对应的映射是确定的,其他的都是任意的,如果-1的个数,只有一个,那么结果就是1,

多校第九场:贪心+矩阵快速幂中间优化+线性递推&amp;线段树递推

HDU 4968 Improving the GPA 思路:贪心的搞吧!比赛的时候想了好久,然后才发现了点规律,然后乱搞1A. 因为贪心嘛!大的情况就是刚开始每个人的分数都是最大的最小值,即绩点4.0的最低分数85,然后最后一个数设为剩余的分数,然后如果小于60就从第一个分数补到这个分数来,然后最后一个分数还小于60,那就用第二个补--依次往下搞,那时我也不知道这样就搞出答案了,我还没证明这个对不对呢,哈哈. 小的情况:小的情况就是先假设每个人都是绩点最小的最大分数,即绩点2.0的最大分数69,

HDU 4970 Killing Monsters 多校第九场1011

Problem Description Kingdom Rush is a popular TD game, in which you should build some towers to protect your kingdom from monsters. And now another wave of monsters is coming and you need again to know whether you can get through it. The path of mons

HDU 4968 Improving the GPA 多校第九场1009

Problem Description Xueba: Using the 4-Point Scale, my GPA is 4.0. In fact, the AVERAGE SCORE of Xueba is calculated by the following formula: AVERAGE SCORE = ∑(Wi * SCOREi) / ∑(Wi) 1<=i<=N where SCOREi represents the scores of the ith course and Wi

2019杭电多校第九场

2019杭电多校第九场 熟悉的后半场挂机节奏,又苟进首页了,很快乐 1001. Rikka with Quicksort upsolved 不是我做的,1e9调和级数分段打表 1002. Rikka with Cake solved at 01:11 有一个矩形,给你很多射线(射线只有横平竖直的四个方向),问把矩形切成了多少块 队友说答案是交点数加一,作为一个合格的工具人,当然是把队友的想法实现啦 二维坐标离散化枚举纵坐标维护横坐标,常规套路,树状数组也可以做(我是线段树写习惯了根本没想起来还有

Arithmetic Sequence(多校第九场)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5400 这题其实就是求有多少公差为d1和公差为d2的等差序列和前半段是公差为d1后半段的公差为d2的序列..... 我们可以用个b数组保存序列中相邻两项的和,然后直接查找b数组的值是否等于d1或d2.再来进行处理.. #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm>

2019 杭电多校 第九场

2019 Multi-University Training Contest 9 补题链接:2019 Multi-University Training Contest 9 1005 Rikka with Game (HDU 6684) 题意 Rikka 和 Yuta 玩游戏.给定一个字符串.两人轮流对字符串操作.可以选择结束游戏,也可以改变其中一个字符,改变规则是:\(a\rightarrow b,b\rightarrow c,-,y\rightarrow z,z\rightarrow a.\

HDU 6166 Senior Pan(多校第九场 二进制分组最短路)

题意:给出n个点和m条有向边(有向边!!!!我还以为是无向查了半天),然后给出K个点,问这k个点中最近的两点的距离 思路:比赛时以为有询问,就直接丢了,然后这题感觉思路很棒,加入把所有点分成起点和终点两部分,然后加个S点和T点与他们 的距离为0,然后跑最短路就可以了,但是这样有可能最近的两个点都在起点或者都在终点,那么就不一定是最短的,所以就有个二进制分组. 考虑每个点的编号的二进制表示,那么对于任何两个点,他们至少有一位二进制不同,那么我们通过枚举二进制的位,当前位为1的作为起点集合, 当前位

多校第九场Travelling Salesman Problem总结

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 题意:n*m的矩阵格子,每个格子有相应的数字,上要从矩阵的左上角走到右下角,要求使得走过的数字之和尽可能多,同时每个格只能走一次,输出走过的数字之和,以及路径 思路:对于n,m任何一个是奇数,那么就能经过所有的格子,如果n,m两个数都是偶数,那么那么讲棋盘黑白染色,假设(1,1)和(n,m)都为黑色,那么这条路径中黑格个数比白格个数多1,而棋盘中黑白格子个数相同,所以必然有一个白格不会被经过,