2020牛客寒假演算法基礎集訓營4 C 子段乘積

2021-10-02 17:53:32 字數 1477 閱讀 4047

題目描述

給出乙個長度為 n 的數列

思路

這個題目可以尺取做,但是需要用逆元還要注意0的情況,不如線段樹直接,線段樹維護每乙個區間的連乘積,最後進行多次查詢取乙個最大值,注意取模

#include #pragma warning (disable:6031)

#pragma warning (disable:4996)

#define mem(a, b) memset(a, b, sizeof a);

using namespace std;

const int n = 2e5 + 10;

const int mod = 998244353;

typedef long long ll;

struct p ;

struct segementtree

int mid = (l + r) / 2;

build(l, mid, k << 1);

build(mid + 1, r, k << 1 | 1);

c[k].lsum = c[k << 1].lsum;

c[k].rsum = c[k << 1 | 1].rsum;

c[k].lsum %= mod;

c[k].rsum %= mod;

if (c[k << 1].lsum == c[k << 1].multi_sum)c[k].lsum = c[k].lsum * c[k << 1 | 1].lsum;

if (c[k << 1 | 1].rsum == c[k << 1 | 1].multi_sum)c[k].rsum = c[k].rsum * (c[k << 1].rsum);

c[k].lsum %= mod;

c[k].rsum %= mod;

c[k].multi_sum = c[k << 1].multi_sum * c[k << 1 | 1].multi_sum;

c[k].multi_sum %= mod;

c[k].max_sum = max(c[k << 1].max_sum, c[k << 1 | 1].max_sum);

c[k].max_sum = max(c[k].max_sum, (c[k << 1].rsum * c[k << 1 | 1].lsum) % mod);

} ll query(int l, int r, int k)

int mid = c[k].l + c[k].r;

mid /= 2;

ll res = 1;

if (l <= mid)

if (r > mid)

return res % mod;

}};segementtree st;

int main()

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

return 0;

}

2020牛客寒假演算法基礎集訓營

長期更新,補完為止 2 g 判正誤 題意 t組資料。判斷a d b e c f是否等於g。1e9 a,b,c,g 1e9,0 d,e,f 1e9。保證不會出現指數和底數同為 0 的情況。思路 硬算會tle或mle。快速冪取模,為了增加過題概率,多取幾個模數判斷。includeusing namesp...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...

2020牛客寒假演算法基礎集訓營1

h題 突然發現h題可以用好多種方法做的。方法一 雙指標,維護乙個修改次數小於等於k的區間 include using namespace std typedef long long ll const int mod 1e9 7 const int n 1e5 5 const int inf 0x3f...