日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu5399(模拟)

發布時間:2025/3/15 编程问答 5 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu5399(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

在一個序列中找出連續的子序列,滿足在這個子序列中從某一個位置開始,左側是一公差是d1的等差序列,右側是一個公差是d2的等差序列,問能找到多少個子序列。


思路:

模擬,不多說,貼隊友的代碼。


代碼:

#include <iostream> #include <cstring> #include <cstdio> using namespace std;const long long maxn = 100005; long long a[maxn];long long L[maxn], R[maxn]; int main() {long long n, d1, d2; // freopen("a.txt","r",stdin);while(EOF != scanf("%I64d%I64d%I64d",&n, &d1, &d2)) {for(long long i = 1; i <= n; i++) {scanf("%I64d",&a[i]);}memset(L, 0, sizeof(L));memset(R,0, sizeof(R));a[0] = 100000000000;a[++n] = 100000000000; // for(long long i = 0; i <= n; i++) { // printf("%I64d ", a[i]); // }puts("");long long ans = n-1;long long num = 1;long long lx, rx = 1;for(long long i = 2; i <= n; i++){if(a[i] - a[i - 1] == d1) {num++;if(num == 2) {lx = i - 1;}}else {if(num >= 2) {long long x = num - 1;ans += (x * (x + 1) / 2);rx = i - 1;L[rx] = lx;}num = 1;}}if(d1 != d2) {num = 1;lx = 1;rx = 1;for(long long i = 2; i <= n; i++){if(a[i] - a[i - 1] == d2) {num++;if(num == 2) {lx = i - 1;}}else {if(num >= 2) {long long x = num - 1;ans += (x * (x + 1) / 2);rx = i - 1;R[lx] = rx;}num = 1;}}for(long long i = 1; i <= n; i++){if(L[i] != 0 && R[i] != 0) {long long m1 = i - L[i];long long m2 = R[i] - i;ans += m1 * m2;}}}printf("%I64d\n", ans); // cout << ans << endl;}return 0; }

總結

以上是生活随笔為你收集整理的hdu5399(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。