线段树

the easy xds code is follow:

#include <cstdio>
#include <iostream>
#define int long long int
using namespace std;

const int N = 1e5+10;

int n, m;
int a[N], b[N<<2], d[N<<2];

inline void build (int s, int t, int p) {
   if (s == t) {d[p] = a[s]; return;}
   int m = (s+t)>>1;
   build (s, m, p<<1), build (m+1, t, (p<<1)|1);
   d[p] = d[p<<1] + d[(p<<1)|1];
}

inline void update (int l, int r, int c, int s, int t, int p) {
   if (l <= s && t <= r) {
      d[p] += (t-s+1)*c;
      b[p] += c;
      return;
   }
   int m = (s+t)>>1;
   if (b[p]) {
      d[p<<1] += (m-s+1)*b[p], d[(p<<1)|1] += (t-m)*b[p];
      b[p<<1] += b[p], b[(p<<1)|1] += b[p];
      b[p] = 0;
   }
   if (l <= m) update (l, r, c, s, m, p<<1);
   if (r > m) update (l, r, c, m+1, t, (p<<1)|1);
   d[p] = d[p<<1] + d[(p<<1)|1];
   return;
}

inline int getsum (int l, int r, int s, int t, int p) {
   if (l <= s && t <= r) return d[p];
   int m = (s+t)>>1, sum = 0;
   if (b[p]) {
      d[p<<1] += (m-s+1)*b[p], d[(p<<1)|1] += (t-m)*b[p];
      b[p<<1] += b[p], b[(p<<1)|1] += b[p];
      b[p] = 0;
   }
   if (l <= m) sum += getsum (l, r, s, m, p<<1);
   if (r > m) sum += getsum (l, r, m+1, t, (p<<1)|1);
   return sum;
}

main () {
   cin >> n >> m;
   for (int i =1 ; i <= n; ++i) cin >> a[i];
   build (1, n, 1);
   for (int i = 1; i <= m; ++ i) {
      int opt, x, y, k;
      cin >> opt >> x >> y;
      if (opt == 1) cin >> k, update (x, y, k, 1, n, 1);
      else cout << getsum (x, y, 1, n, 1) << '
';
   }
   return 0;
}

and the code with the 'mul' is follow:

#include <cstdio>
#include <iostream>
#define int long long int
using namespace std;

const int N = 1e5+10;

int n, m, mod;
int a[N], b[N<<2], d[N<<2], y[N<<2];

inline void pd (int p, int s, int t) {
   int l = p<<1, r = (p<<1)|1, m = (s+t)>>1;
   if (y[p] != 1) {
      y[l] *= y[p], y[r] *= y[p];
      b[l] *= y[p], b[r] *= y[p];
      d[l] *= y[p], d[r] *= y[p];
      y[l] %= mod, y[r] %= mod;
      b[l] %= mod, b[r] %= mod;
      d[l] %= mod, d[r] %= mod;
      y[p] = 1;
   }
   if (b[p] != 0) {
      d[l] += (m-s+1)*b[p], d[r] += (t-m)*b[p];
      b[l] += b[p], b[r] += b[p];
      d[l] %= mod, d[r] %= mod;
      b[l] %= mod, b[r] %= mod;
      b[p] = 0;
   }
   return;
}

inline void build (int s, int t, int p) {
   y[p] = 1;
   if (s == t) {d[p] = a[s]%mod; return;}
   int m = (s+t)>>1;
   build (s, m, p<<1), build (m+1, t, (p<<1)|1);
   d[p] = (d[p<<1] + d[(p<<1)|1])%mod;
}

inline void chenge (int l, int r, int c, int s, int t, int p) {
   if (l <= s && t <= r) {
      d[p] *= c, d[p] %= mod; 
      b[p] *= c, b[p] %= mod;
      y[p] *= c, y[p] %= mod;
      return;
   }
   int m = (s+t)>>1;
   pd (p, s, t);
   if (l <= m) chenge (l, r, c, s, m, p<<1);
   if (r > m) chenge (l, r, c, m+1, t, (p<<1)|1);
   d[p] = (d[p<<1] + d[(p<<1)|1])%mod;
}

inline void add (int l, int r, int c, int s, int t, int p) {
   if (l <= s && t <= r) {
      d[p] += (t-s+1)*c, d[p] %= mod;
      b[p] += c, b[p] %= mod;
      return;
   }
   int m = (s+t)>>1;
   pd (p, s, t);
   if (l <= m) add (l, r, c, s, m, p<<1);
   if (r > m) add (l, r, c, m+1, t, (p<<1)|1);
   d[p] = (d[p<<1] + d[(p<<1)|1])%mod;	
}

inline int getsum (int l, int r, int s, int t, int p) {
   if (l <= s && t <= r) return d[p]%mod;
   int m = (s+t)>>1, sum = 0;
   pd (p, s, t);
   if (l <= m) sum += getsum (l, r, s, m, p<<1)%mod;
   if (r > m) sum += getsum (l, r, m+1, t, (p<<1)|1)%mod;
   return sum;
}

main () {
   cin >> n >> m >> mod;
   for (int i = 1; i <= n; ++ i) cin >> a[i];
   build (1, n, 1);
   for (int i = 1; i <= m; ++ i) {
      int opt, x, y, k;
      cin >> opt >> x >> y;
      if (opt == 1) cin >> k, chenge (x, y, k, 1, n, 1);
      if (opt == 2) cin >> k, add (x, y, k, 1, n, 1);
      if (opt == 3) cout << getsum (x, y, 1, n, 1)%mod << '
';
   }
   return 0;
}

the thought is easy

but there is some details

PS:

1.if must with the '(return)'

2.'<<' and '>>'

3.'update' and 'add' and 'chenge' need
(d[p] = d[p<<1] + d[(p<<1)|1])

4.(y[p]) need put on the first of the (build)

5.(int) && (long long)

原文地址:https://www.cnblogs.com/yszhyhm/p/13365594.html