рдПрдХ рдЦрдВрдб рдкрд░ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдлреЗрдирд╡рд┐рдХ рд╡реГрдХреНрд╖

рдпрд╣ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдВрд╢реЛрдзрди рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рддрддреНрд╡реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрднреА рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдкрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

1. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг


рдПрдХ рд╕рд░рдгреА рд╣реИред рдЖрдкрдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
  1. рд╕рдВрд╢реЛрдзрди - рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ d рдЬреЛрдбрд╝реЗрдВ [l, r]
  2. рдпреЛрдЧ - рдЦрдВрдб рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ [l, r]

2. рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рд╡рд░рдг


рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЦрдВрдб [0, r] рдХреЛ рдЦрдВрдб [l, r] рдХреЛ рджреЛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдХрд░ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ "рд╕реБрдЧрдо" рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рджреВрд╕рд░рд╛ рдПрд░реЗ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдпрд╣ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд╕рднреА рдирдВрдмрд░реЛрдВ рдореЗрдВ рдХрд┐рддрдирд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред

рднрд╡рд┐рд╖реНрдп рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдлреЗрдирд╡рд┐рдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред

class Fenwick{ int *m, *mt, N; public: Fenwick(int n); Fenwick(int a[], int n); void add_range(int r, int d); void add_range(int l, int r, int d); int sum(int r); int sum(int l, int r); }; 


рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ, рдпрд╣ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд░рдгреА рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреЗрдбрд╝ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЖрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВред

 Fenwick::Fenwick(int n){ N = n; m = new int[N]; mt = new int[N]; memset(m, 0, sizeof(int)*N); memset(mt, 0, sizeof(int)*N); } Fenwick::Fenwick(int a[], int n){ N = n; m = new int[N]; mt = new int[N]; memset(m, 0, sizeof(int)*N); memset(mt, 0, sizeof(int)*N); for(int i=0;i<N;++i){ m[i] += a[i]; if((i|(i+1))<N) m[i|(i+1)] += m[i]; } } 


рдЕрдм рдкрд░рд┐рд╡рд░реНрддрди рдСрдкрд░реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрдиреБрд░реЛрдз "рдЦрдВрдб рдХреЗ рддрддреНрд╡реЛрдВ рдореЗрдВ 1 рдЬреЛрдбрд╝ рджреЗрдВ [0, 9]"ред рдпрд╣ рдЦрдВрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рдЦрдВрдбреЛрдВ [0, 7] рдФрд░ [8, 9] рд╕реЗ рдЖрдЪреНрдЫрд╛рджрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП, рддрддреНрд╡реЛрдВ 7 рдФрд░ 9 рдореЗрдВ рд╣рдо рд╕рд░рдгреА mt 1 рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕реЗ рдЦрдВрдб рд╣реИрдВ рдЬрд┐рдирдореЗрдВ [0, 9] (рдпрд╛ рдЗрд╕рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛) рдПрдХ рдЙрдк-рдЦрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдпреЗ рд╕рднреА рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдЙрдирдХреЗ рд▓рд┐рдП, рд╕рд░рдгреА рдореЗрдВ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЦрдВрдб рдХреЗ рдХрдИ рддрддреНрд╡реЛрдВ [0, 9] рдореЗрдВ рд╡реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, 2 рд╕реЗ m [11] рдФрд░ 10 рд╕реЗ m [15] рдЬреЛрдбрд╝реЗрдВред



рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдЙрд╕реА рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдлреЗрдирд╡рд┐рдХ рдкреЗрдбрд╝ рдХреЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреБрд░рдВрдд рдХреЛрдб рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред

 void Fenwick::add_range(int r, int d){ if(r<0) return ; for(int i=r;i>=0;i=(i&(i+1))-1) mt[i] += d; for(int i=r|(r+1);i<N;i|=i+1) m[i] += d*(r-(i&(i+1))+1); } void Fenwick::add_range(int l, int r, int d){ add_range(r, d); add_range(l-1, -d); } 


рдЙрдкрд╕рд░реНрдЧ рдкрд░ рд░рд╛рд╢рд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рдЪрд┐рддреНрд░ рдПрдХрдорд╛рддреНрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЙрдкрдпреБрдХреНрдд рд╣реИ рдХрд┐ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдо рдФрд░ рдПрдордЯреА рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдиреАрд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдордЯреА (рдпрд╛рдиреА, рдмрдбрд╝реЗ рдХрд╡рд░рд┐рдВрдЧ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛)ред

 int Fenwick::sum(int r){ if(r<0) return 0; int res = 0; for(int i=r;i>=0;i=(i&(i+1))-1) res += m[i] + mt[i]*(i-(i&(i+1))+1); for(int i=r|(r+1);i<N;i|=i+1) res += mt[i]*(r-(i&(i+1))+1); return res; } int Fenwick::sum(int l, int r){ return sum(r) - sum(l-1); } 

3. рд╕рд╛рд░рд╛рдВрд╢


рд╣рдо рдУ (рдПрди) рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рд╕рдВрд╢реЛрдзрди рдФрд░ рд╣реЗ (рд▓реЙрдЧрдПрди) рдореЗрдВ рд╕реЗрдЧрдореЗрдВрдЯ рдкрд░ рд░рд╛рд╢рд┐ред 10,000,000 рддрддреНрд╡реЛрдВ рдФрд░ 10,000,000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдкрд░, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдЦреНрдпрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИрдВ:
рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдкреНрд░рд╛рд░рдВрднрдкрд░рд┐рд╡рд░реНрддрдирдпреЛрдЧ
Fenwick0.13 рдПрд╕9.12 рдПрд╕8.90 рдПрд╕
RSQ ( рдИ-рдореИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди )0.25 рдПрд╕17.13 рдПрд╕13.53 рд╕реЗ

Source: https://habr.com/ru/post/In170933/


All Articles