茅断卉 发表于 2025-6-4 19:40:10

AtCoder Beginner Contest 369(ABC369)

Count Arithmetic Subarrays

题意:

判断有多少个区间是等差数列(不能重排)。
\(1 \le n \times 10^5\)。
思路:

赛时看错题了,以为这个区间可以重排,卡了 8min,小丑了。
首先容易注意到,对于一个区间 \(\),若其是等差数列,则这个区间的子区间 \(\) 肯定也是子序列,造成的贡献是 \(\frac{(r-l+1)(r-l+2)}{2}\)。
那么考虑求出所有极长等差区间,设 \(d_i = a_{i+1} - a_i\),若 \(i\) 能加入 \(i-1\) 的等差区间,当且仅当 \(d_i = d_{i-1}\);否则就要新开一个等差子区间。
注意最后答案要加 \(n-1\)。
时间复杂度为 \(O(N)\)。
完整代码: #include#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)#define lowbit(x) x&(-x)#define pi pair#define pii pair#define iip pair#define ppii pair#define fi first#define se second#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x#define Full(A) memset(A,0,sizeof(A))#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);#define For(i,l,r) for(int i=l;i=l;i--)using namespace std;typedef long double lb;typedef double db;typedef unsigned long long ull;typedef long long ll;bool Begin;const int N=2e5+6;inline ll read(){    ll x=0,f=1;    char c=getchar();    while(c'9'){      if(c=='-')          f=-1;      c=getchar();    }    while(c>='0'&&c

呵烘稿 发表于 2025-11-9 16:55:53

用心讨论,共获提升!

颜清华 发表于 2025-11-19 04:26:46

用心讨论,共获提升!

热琢 发表于 2025-11-28 02:34:47

yyds。多谢分享

拼潦 发表于 2025-12-11 06:40:35

谢谢分享,辛苦了

创蟀征 发表于 2025-12-22 03:32:16

感谢,下载保存了

怀陶宁 发表于 2026-1-6 23:37:23

感谢,下载保存了

泡市 发表于 2026-1-16 18:00:53

用心讨论,共获提升!

坏级尹 发表于 2026-1-19 11:46:57

感谢分享

哈妙思 发表于 2026-1-20 21:51:29

过来提前占个楼

阕阵闲 发表于 2026-1-21 14:36:14

过来提前占个楼

轮达 发表于 2026-1-24 10:12:02

感谢分享,下载保存了,貌似很强大

雌鲳签 发表于 2026-1-27 05:21:59

yyds。多谢分享

赊朗爆 发表于 2026-1-27 07:12:03

感谢分享

更成痒 发表于 2026-2-2 05:00:09

这个好,看起来很实用

肿抢 发表于 2026-2-5 03:04:27

谢谢楼主提供!

寿爹座 发表于 2026-2-5 11:02:55

用心讨论,共获提升!

锦惺 发表于 2026-2-8 03:10:56

新版吗?好像是停更了吧。

轩辕琳芳 发表于 2026-2-8 05:44:51

分享、互助 让互联网精神温暖你我

仇华乐 发表于 2026-2-8 19:59:57

yyds。多谢分享
页: [1] 2
查看完整版本: AtCoder Beginner Contest 369(ABC369)