Browse Source

recreating algo repository

master
RinRi 3 years ago
commit
a4a3f8e87a
23 changed files with 1773 additions and 0 deletions
  1. +29
    -0
      binary-search/binary-search.cpp
  2. +112
    -0
      data-structures/dk-dereva.cpp
  3. +94
    -0
      data-structures/fenwick.cpp
  4. +103
    -0
      data-structures/painters.cpp
  5. +59
    -0
      data-structures/rycarski_turnir356a.cpp
  6. +123
    -0
      data-structures/segtreecolminupdx.cpp
  7. +99
    -0
      data-structures/segtreekth.cpp
  8. +99
    -0
      data-structures/segtreeminupdx.cpp
  9. +96
    -0
      data-structures/segtreesufpref.cpp
  10. +117
    -0
      data-structures/segtreesumupdlr.cpp
  11. +99
    -0
      data-structures/segtreesumupdx.cpp
  12. +61
    -0
      data-structures/sparse-table.cpp
  13. +71
    -0
      graphs/bridges.cpp
  14. +61
    -0
      graphs/cutpoints.cpp
  15. +56
    -0
      graphs/dijkstra.cpp
  16. +62
    -0
      graphs/lca.cpp
  17. +71
    -0
      graphs/maxflow.cpp
  18. +73
    -0
      graphs/unionday.cpp
  19. +91
    -0
      math/combinatorics.cpp
  20. +59
    -0
      math/meet-in-the-middle.cpp
  21. +20
    -0
      math/pascaltriangle.cpp
  22. +118
    -0
      math/two-turtles.cpp
  23. BIN
      other/ioi-ideas.pdf

+ 29
- 0
binary-search/binary-search.cpp View File

@@ -0,0 +1,29 @@
#include <iostream>
#include <algorithm>

using namespace std ;

int main()
{
int n ;
cin >> n ;
int a[n] ;
for(int i = 0 ; i < n ; ++i) cin >> a[i] ;
sort(a,a+n) ;
int x ;
cin >> x ;
int l = 0 , r = n ;
while(r-l>1)
{
int mid = (r+l)/2 ;
if(a[mid] <= x)
l = mid ;
else r = mid ;
}
if(a[l]==x)
cout << l ;
else
cout << -1 ;
}



+ 112
- 0
data-structures/dk-dereva.cpp View File

@@ -0,0 +1,112 @@
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
#include <vector>

#define pb push_back
#define ll long long
#define ub upper_bound
#define lb lower_bound
#define sc(x) scanf("%I64d",&x)
#define pr(x) printf("%I64d\n",x)

using namespace std ;

const int MAXN = 1e9+1 ;
const int N = 1e6+1 ;
int n , m , k , x , y , z ;
int a[N] , d[30][N] , U[N] ;

struct node
{
int x, sz, y ;
node *l, *r ;
node (int X = 0)
{
x = X ;
sz = 1 ;
y = rand () ;
l = r = NULL ;
}
} *t ;

typedef node* pnode ;

int GetSz (pnode t)
{
if (!t)
return 0 ;
return t -> sz ;
}

int GetKey(pnode t)
{
if (!t)
return 0 ;
return GetSz (t -> l) + 1 ;
}

void upd (pnode t)
{
if (!t)
return ;
t -> sz = GetSz (t -> l) + GetSz (t -> r) + 1 ;
}

pnode Merge (pnode a , pnode b)
{
if (!a)
return b ;
if (!b)
return a ;
if (a -> y > b -> y)
{
a -> r = Merge ( a -> r , b );
upd (a) ;
return a ;
}
else
{
b -> l = Merge ( a , b -> l ) ;
upd (b) ;
return b ;
}
}

void Split (pnode t , pnode &a , pnode &b , int x)
{
if (!t)
return void (a = b = NULL);
int key = GetKey (t) ;
if (key <= x)
{
Split ( t -> r , t -> r , b , x - key ) ;
a = t ;
}
else
{
Split ( t -> l , a , t -> l , x ) ;
b = t ;
}
upd (a) ;
upd (b) ;
}
void add (int x)
{
pnode L , R , M ;
L = R = M = NULL ;
Split ( t , L , R , x ) ;
Split ( L , L , M , x - 1 ) ;
M = Merge ( new node ( x ) , M ) ;
L = Merge ( L , M ) ;
t = Merge ( L , R ) ;
}

int main()
{
}

+ 94
- 0
data-structures/fenwick.cpp View File

@@ -0,0 +1,94 @@
#include <bits/stdc++.h>

#define F first
#define S second
#define pb(x) push_back(x)
#define iosb ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define BIT(x) __builtin_popcount(x)

using namespace std ;

const int MAXN = 1e6+1 ;
const int MaxN = 1e5+1 ;
const int N = 1e4+1 ;
const int M = 1e3+1 ;
const int MOD = 1e9+7 ;
const int inf = 2e9+7 ;
const long long INF = 2e18+7 ;

int t[MaxN] , n , a[MaxN] ;

int sum(int v)
{
int res = 0 ;
if(v==-1)
return 0 ;
for(; v > 0 ; v = (v & (v + 1)) - 1)
res += t[v] ;
return res ;
}

void upd(int pos , int delta)
{
a[pos] += delta ;
for( ; pos < n ; pos |= pos+1)
t[pos] += delta ;
}

/*
int get_min(int v)
{
int res = inf ;

for (; v >= 0; v = (v & (v + 1)) - 1)
res = min(res , f[v]) ;

return res ;
}

void assign(int pos, int delta)
{
a[pos] = delta ;

for (; pos < n ; pos |= pos + 1)
f[pos] = min(f[pos] , delta) ;
}
*/

main()
{
// freopen(".in" , "r" , stdin) ;
// freopen(".out" , "w" , stdout) ;
cin >> n ;
for(int i = 0 ; i < n ; ++i)
{
int x ;
cin >> x ;
upd(i , x) ;
}
/*
for(int i = 0 ; i < n ; ++i)
f[i] = inf ;

for(int i = 0 ; i < n ; ++i)
{
int t ;
cin >> t ;
assign(i , t) ;
}
*/
int q ;
cin >> q ;
while(q--)
{
int l , r ;
cin >> l >> r ;
cout << sum(r-1) - sum(l-2) << '\n' ;
}
return 0 ;
}


+ 103
- 0
data-structures/painters.cpp View File

@@ -0,0 +1,103 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 8e6+123 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

struct item{
int cnt = 0, pref = 0, suff = 0, sum = 0 ;
} t[MaxN] ;
int m[MaxN] ;

void push(int v, int x, int y)
{
if (m[v] != -1 && v*2+1 < 4000004)
{
m[v*2] = m[v*2+1] = m[v] ;
m[v] = -1 ;

int z = (x+y)/2 ;
t[v*2].sum = (z*1ll-x*1ll+1ll) * (m[v*2]*1ll) ;
t[v*2].pref = m[v*2] ;
t[v*2].cnt = m[v*2] ;
t[v*2].suff = m[v*2] ;
t[v*2+1].sum = (y*1ll-z*1ll) * (m[v*2+1]*1ll) ;
t[v*2+1].pref = m[v*2+1] ;
t[v*2+1].cnt = m[v*2+1] ;
t[v*2+1].suff = m[v*2+1] ;
}
}

void update(int l, int r, int c, int v, int x, int y)
{
if (l <= x && y <= r) {
t[v].sum = c*1ll * (y*1ll-x*1ll+1ll) ;
t[v].cnt = c ;
t[v].pref = c ;
t[v].suff = c ;
m[v] = c ;
return ;
}

if (y < l || r < x)
return ;

push(v, x, y) ;
int z = (x+y)/2 ;
update(l, r, c, v * 2, x, z) ;
update(l, r, c, v * 2 + 1, z+1, y) ;
t[v].pref = t[v*2].pref,
t[v].suff = t[v*2+1].suff,
t[v].sum = t[v*2].sum + t[v*2+1].sum,
t[v].cnt = t[v*2].cnt + t[v*2+1].cnt - (t[v*2].suff && t[v*2+1].pref?1:0);
}

int main()
{
freopen("painter.in", "r", stdin) ;
freopen("painter.out", "w", stdout) ;
for(int i = 0 ; i < MaxN ; ++i)
m[i] = -1 ;
int n ;
cin >> n ;
while(n--)
{
char c ;
int l, r ;
cin >> c >> l >> r ;
if(c == 'W') c = 0 ;
else c = 1 ;
update(l+500001, l+r-1+500001, int(c), 1, 1, 2000000);
cout << t[1].cnt << ' ' << t[1].sum << '\n' ;
}
}
/*
7
W 2 3
B 2 2
B 4 2
B 3 2
B 7 2
W 3 1
W 0 10
*/

+ 59
- 0
data-structures/rycarski_turnir356a.cpp View File

@@ -0,0 +1,59 @@
#include <bits/stdc++.h>

using namespace std;

int n , m , add[1200004],t[1200004],l[300003],r[300003],x[300003];

void push(int v , int tl ,int tr)
{
if(add[v] != 0)
{
if(tl != tr)
add[v * 2] = add[v] ,
add[v * 2 + 1] = add[v] ;
t[v] = add[v] ;
add[v] = 0 ;
}
}
void update(int v,int tl, int tr , int l,int r ,int x)
{
push(v,tl,tr) ;
if(tl > r || tr < l || l > r){
return ;
}
if(l <= tl && tr <= r)
{
add[v] = x ;
push(v,tl,tr) ;
return ;
}
int mid = (tl + tr) / 2 ;
update(v * 2 , tl , mid , l ,r , x);
update(v * 2 + 1, mid + 1, tr , l , r , x);
}
int get(int v , int tl ,int tr , int pos)
{
push(v,tl,tr) ;
if(tl == tr)
return t[v ];
else
{
int mid = (tl + tr) / 2 ;
if(pos <= mid)
get(v * 2, tl ,mid , pos) ;
else
get(v * 2 + 1, mid + 1, tr, pos) ;
}
}
int main()
{
cin >> n >> m ;
for(int i = 1 ; i <= m ; i++) cin >> l[i] >> r[i] >> x[i] ;
for(int i = m ; i >= 1 ; i--)
{
update(1,1,n,x[i]+1,r[i],x[i]) ;
update(1,1,n,l[i],x[i]-1,x[i]) ;
}
for(int i = 1; i <= n ; i++)
cout << get(1,1,n,i) << ' ' ;
}

+ 123
- 0
data-structures/segtreecolminupdx.cpp View File

@@ -0,0 +1,123 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

L a[MaxN], n, m ;

struct{
L mn = INF, c = 0 ;
} t[MaxN*4] ;

void build(int v, int tl, int tr)
{
if(tl == tr)
{
t[v].mn = a[tl] ;
t[v].c = 1 ;
return ;
}

int tm = (tl + tr) >> 1 ;
build(v*2, tl, tm) ;
build(v*2+1, tm+1, tr) ;
t[v].mn = min(t[v*2].mn, t[v*2+1].mn) ;
t[v].c = (t[v].mn==t[v*2].mn?t[v*2].c:0) + (t[v].mn==t[v*2+1].mn?t[v*2+1].c:0) ;
}

void update(int v, int tl, int tr, int l, int x)
{
if(tl == tr && tl == l)
{
t[v].mn = x ;
t[v].c = 1 ;
return ;
}
if(tr < l || l < tl)
return ;

int tm = (tl + tr) >> 1 ;
update(v*2, tl, tm, l, x) ;
update(v*2+1, tm+1, tr, l, x) ;
t[v].mn = min(t[v*2].mn, t[v*2+1].mn) ;
t[v].c = (t[v].mn==t[v*2].mn?t[v*2].c:0) + (t[v].mn==t[v*2+1].mn?t[v*2+1].c:0) ;
}

L get(int v, int tl, int tr, int l, int r)
{
if(l <= tl && tr <= r)
return t[v].mn ;

if(l > tr || r < tl)
return INF ;

int tm = (tl + tr) >> 1 ;
return min(get(v*2, tl, tm, l, r), get(v*2+1, tm+1, tr, l, r)) ;
}

L col(int v, int tl, int tr, int l, int r, int mn)
{
if(l <= tl && tr <= r)
return (t[v].mn == mn?t[v].c:0) ;
if(l > tr || r < tl)
return 0 ;

int tm = (tl + tr) >> 1 ;
L cl = 0 ;
cl += col(v*2, tl, tm, l, r, mn) ;
cl += col(v*2+1, tm+1, tr, l, r, mn) ;
return cl ;
}

int32_t main(int argc, char *argv[])
{
if(argc > 1)
freopen(argv[1], "r", stdin) ;
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
cin >> n >> m ;
for(int i = 0 ; i < n ; ++i)
cin >> a[i] ;

build(1, 0, n-1) ;

while(m--)
{
int type, l, r, x ;
cin >> type ;
if(type == 1)
{
cin >> l >> x ;
update(1, 0, n-1, l, x) ;
}
else
{
cin >> l >> r ;
int mn = get(1, 0, n-1, l, r-1), cl = col(1, 0, n-1, l, r-1, mn) ;
cout << mn << ' ' << cl << '\n' ;
}
}
}

+ 99
- 0
data-structures/segtreekth.cpp View File

@@ -0,0 +1,99 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

int t[4*MaxN], a[MaxN], n, m ;

void build(int v, int tl, int tr)
{
if(tl == tr)
{
t[v] = a[tl] ;
return ;
}

int tm = (tl + tr) >> 1 ;
build(v*2, tl, tm) ;
build(v*2+1, tm+1, tr) ;
t[v] = t[v*2] + t[v*2+1] ;
}

void update(int v, int tl, int tr, int l)
{
if(tl == tr && tl == l)
{
t[v] ^= 1;
return ;
}
if(tr < l || l < tl)
return ;

int tm = (tl + tr) >> 1 ;
update(v*2, tl, tm, l) ;
update(v*2+1, tm+1, tr, l) ;
t[v] = t[v*2] + t[v*2+1] ;
}

int idx(int v, int tl, int tr, int k)
{
if(tl == tr)
return tl ;

int tm = (tl + tr) >> 1 ;
if(t[v*2] >= k)
return idx(v*2, tl, tm, k) ;
else
return idx(v*2+1, tm+1, tr, k-t[v*2]) ;
}

int32_t main(int argc, char *argv[])
{
if(argc > 1)
freopen(argv[1], "r", stdin) ;
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
cin >> n >> m ;
for(int i = 0 ; i < n ; ++i)
cin >> a[i] ;

build(1, 0, n-1) ;

while(m--)
{
int type, l ;
cin >> type ;
if(type == 1)
{
cin >> l ;
update(1, 0, n-1, l) ;
}
else
{
cin >> l ;
cout << idx(1, 0, n-1, l+1) << '\n' ;
}
}
}

+ 99
- 0
data-structures/segtreeminupdx.cpp View File

@@ -0,0 +1,99 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

L t[4*MaxN], mod[4*MaxN], a[MaxN], n, m ;

void build(int v, int tl, int tr)
{
if(tl == tr)
{
t[v] = a[tl] ;
return ;
}

int tm = (tl + tr) >> 1 ;
build(v*2, tl, tm) ;
build(v*2+1, tm+1, tr) ;
t[v] = min(t[v*2], t[v*2+1]) ;
}

void update(int v, int tl, int tr, int l, int x)
{
if(tl == tr && tl == l)
{
t[v] = x ;
return ;
}
if(tr < l || l < tl)
return ;

int tm = (tl + tr) >> 1 ;
update(v*2, tl, tm, l, x) ;
update(v*2+1, tm+1, tr, l, x) ;
t[v] = min(t[v*2], t[v*2+1]) ;
}

L get(int v, int tl, int tr, int l, int r)
{
if(l <= tl && tr <= r)
return t[v] ;

if(l > tr || r < tl)
return INF ;

int tm = (tl + tr) >> 1 ;
return min(get(v*2, tl, tm, l, r), get(v*2+1, tm+1, tr, l, r)) ;
}

int32_t main(int argc, char *argv[])
{
if(argc > 1)
freopen(argv[1], "r", stdin) ;
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
cin >> n >> m ;
for(int i = 0 ; i < n ; ++i)
cin >> a[i] ;

build(1, 0, n-1) ;

while(m--)
{
int type, l, r, x ;
cin >> type ;
if(type == 1)
{
cin >> l >> x ;
update(1, 0, n-1, l, x) ;
}
else
{
cin >> l >> r ;
cout << get(1, 0, n-1, l, r-1) << '\n' ;
}
}
}

+ 96
- 0
data-structures/segtreesufpref.cpp View File

@@ -0,0 +1,96 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

L a[MaxN], n, m ;

struct{
L pref = -INF, suff = -INF, sum = -INF, ans = -INF ;
} t[MaxN*4] ;

void build(int v, int tl, int tr)
{
if(tl == tr)
{
t[v].sum = a[tl] ;
t[v].ans = a[tl] ;
t[v].pref = a[tl] ;
t[v].suff = a[tl] ;
return ;
}

int tm = (tl + tr) >> 1 ;
build(v*2, tl, tm) ;
build(v*2+1, tm+1, tr) ;
t[v].ans = max(max(t[v*2].ans, t[v*2+1].ans), t[v*2].suff + t[v*2+1].pref) ;
t[v].sum = t[v*2].sum + t[v*2+1].sum ;
t[v].pref = max(t[v*2].pref, t[v*2].sum + t[v*2+1].pref) ;
t[v].suff = max(t[v*2+1].suff, t[v*2].suff + t[v*2+1].sum) ;
}

void update(int v, int tl, int tr, int l, int x)
{
if(tl == tr && tl == l)
{
t[v].sum = x ;
t[v].ans = x ;
t[v].pref = x ;
t[v].suff = x ;
return ;
}
if(tr < l || l < tl)
return ;

int tm = (tl + tr) >> 1 ;
update(v*2, tl, tm, l, x) ;
update(v*2+1, tm+1, tr, l, x) ;
t[v].ans = max(max(t[v*2].ans, t[v*2+1].ans), t[v*2].suff + t[v*2+1].pref) ;
t[v].sum = t[v*2].sum + t[v*2+1].sum ;
t[v].pref = max(t[v*2].pref, t[v*2].sum + t[v*2+1].pref) ;
t[v].suff = max(t[v*2+1].suff, t[v*2].suff + t[v*2+1].sum) ;
}

int32_t main(int argc, char *argv[])
{
if(argc > 1)
freopen(argv[1], "r", stdin) ;
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
cin >> n >> m ;
for(int i = 0 ; i < n ; ++i)
cin >> a[i] ;

build(1, 0, n-1) ;
cout << max(0ll, t[1].ans) << '\n' ;
while(m--)
{
int l, x ;
cin >> l >> x ;
update(1, 0, n-1, l, x) ;
cout << max(0ll, t[1].ans) << '\n' ;
}
}

+ 117
- 0
data-structures/segtreesumupdlr.cpp View File

@@ -0,0 +1,117 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

int t[4*MaxN], mod[4*MaxN], a[MaxN], n ;

void build(int v, int tl, int tr)
{
if(tl == tr)
{
t[v] = a[tl] ;
return ;
}

int tm = (tl + tr) >> 1 ;
build(v*2, tl, tm) ;
build(v*2+1, tm+1, tr) ;
t[v] = t[v*2] + t[v*2+1] ;
}

void push(int v, int tl, int tr)
{
if(mod[v] != 0 && v*2+1 < 4*MaxN)
{
mod[v*2] = mod[v*2+1] = mod[v] ;
mod[v] = 0 ;

int tm = (tl + tr) >> 1 ;
t[v*2] = (tm-tl+1) * mod[v*2] ;
t[v*2+1] = (tr-tm) * mod[v*2+1] ;
}
}

void update(int v, int tl, int tr, int l, int r, int x)
{
if(l <= tl && tr <= r)
{
t[v] = x * (tr-tl+1) ;
mod[v] = x ;
return ;
}
if(tr < l || r < tl)
return ;

push(v, tl, tr) ;
int tm = (tl + tr) >> 1 ;
update(v*2, tl, tm, l, r, x) ;
update(v*2+1, tm+1, tr, l, r, x) ;
t[v] = t[v*2] + t[v*2+1] ;
}

int get(int v, int tl, int tr, int l, int r)
{
if(l <= tl && tr <= r)
return t[v] ;

if(l > tr || r < tl)
return 0 ;

push(v, tl, tr) ;
int tm = (tl + tr) >> 1 ;
return get(v*2, tl, tm, l, r) + get(v*2+1, tm+1, tr, l, r) ;
}

int32_t main(int argc, char *argv[])
{
if(argc > 1)
freopen(argv[1], "r", stdin) ;
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
cin >> n ;
for(int i = 1 ; i <= n ; ++i)
cin >> a[i] ;

build(1, 1, n) ;

int t ;
cin >> t ;
while(t--)
{
int type, l, r, x ;
cin >> type ;
if(type == 1)
{
cin >> l >> r >> x ;
update(1, 1, n, l, r, x) ;
}
else
{
cin >> l >> r ;
cout << get(1, 1, n, l, r) << '\n' ;
}
}
}

+ 99
- 0
data-structures/segtreesumupdx.cpp View File

@@ -0,0 +1,99 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;

L t[4*MaxN], mod[4*MaxN], a[MaxN], n, m ;

void build(int v, int tl, int tr)
{
if(tl == tr)
{
t[v] = a[tl] ;
return ;
}

int tm = (tl + tr) >> 1 ;
build(v*2, tl, tm) ;
build(v*2+1, tm+1, tr) ;
t[v] = t[v*2] + t[v*2+1] ;
}

void update(int v, int tl, int tr, int l, int x)
{
if(tl == tr && tl == l)
{
t[v] = x ;
return ;
}
if(tr < l || l < tl)
return ;

int tm = (tl + tr) >> 1 ;
update(v*2, tl, tm, l, x) ;
update(v*2+1, tm+1, tr, l, x) ;
t[v] = t[v*2] + t[v*2+1] ;
}

L get(int v, int tl, int tr, int l, int r)
{
if(l <= tl && tr <= r)
return t[v] ;

if(l > tr || r < tl)
return 0 ;

int tm = (tl + tr) >> 1 ;
return get(v*2, tl, tm, l, r) + get(v*2+1, tm+1, tr, l, r) ;
}

int32_t main(int argc, char *argv[])
{
if(argc > 1)
freopen(argv[1], "r", stdin) ;
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
cin >> n >> m ;
for(int i = 0 ; i < n ; ++i)
cin >> a[i] ;

build(1, 0, n-1) ;

while(m--)
{
int type, l, r, x ;
cin >> type ;
if(type == 1)
{
cin >> l >> x ;
update(1, 0, n-1, l, x) ;
}
else
{
cin >> l >> r ;
cout << get(1, 0, n-1, l, r-1) << '\n' ;
}
}
}

+ 61
- 0
data-structures/sparse-table.cpp View File

@@ -0,0 +1,61 @@
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
#include <vector>

#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define sc(x) scanf("%I64d",&x)
#define pr(x) printf("%I64d\n",x)
#define int long long

using namespace std ;

const int MAXN = 1e9+1 ;
const int N = 1e6+1 ;
int n , m , k , x , y , z , gt ;
int a[N] , d[30][N] , p[N] ;

void build ()
{
for (int i = 1 ; i <= n ; ++i )
d[0][i] = a[i] ;
for (int i = 2 ; i < N ; ++i )
p[i] = p[i / 2] + 1;
for (int i = 1 ; i <= p[n] ; ++i )
for (int j = 1 ; j <= n - (1 << p[i]) + 1 ; ++j )
d[i][j] = min (d[i - 1][j] , d[i - 1][j + (1 << (i - 1))]) ;
}

int get (int l , int r)
{
int rr = max(r,l) ;
int ll = min(r,l) ;
int m = rr-ll + 1 ;
m = p[m] ;
return min (d[m][ll] , d[m][rr - (1 << m) + 1]) ;
}

main()
{
cin >> n >> m >> a[1] ;
for ( int i = 2 ; i <= n ; ++i )
{
a[i] = (23*a[i-1]+21563) % 16714589 ;
}
build() ;
int l , r ;
cin >> l >> r ;
for ( int i = 2 ; i <= m ; ++i )
{
gt = get(l,r) ;
l = ((17*l+751+gt+2*(i-1))%n)+1 ;
r = ((13*r+593+gt+5*(i-1))%n)+1 ;
}
gt = get(l,r) ;
cout << l << ' ' << r << ' ' << gt ;
}

+ 71
- 0
graphs/bridges.cpp View File

@@ -0,0 +1,71 @@
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <cstdio>

using namespace std ;

map<pair<int,int>,int> mp ;

int tin[20001] , fup[20001] , timer ;

vector <int> g[20001] , ans ;

bool used[20001] ;

void dfs(int v,int p = -1)
{
used[v] = 1 ;
tin[v]=fup[v]=timer,timer++ ;
for(int i = 0 ; i < g[v].size() ; ++i)
{
int u = g[v][i] ;
if(u==p)
continue ;
if(used[u])
fup[v]=min(fup[v],tin[u]) ;
else
{
dfs(u,v) ;
fup[v] = min(fup[v],fup[u]) ;
if(tin[v]<fup[u])
{
pair<int,int>pr ;
pr.first = v , pr.second = u ;
ans.push_back(mp[pr]) ;
}
}
}
}

int main()
{
int n , m ;
cin >> n >> m ;
for(int i = 0 ; i < m ; ++i)
{
pair<int,int>pr ;
cin >> pr.first >> pr.second ;
mp[pr] = i+1 ;
pair<int,int>pr1;
pr1.first = pr.second ;
pr1.second = pr.first ;
mp[pr1] = i+1 ;
g[pr.first].push_back(pr.second) ;
g[pr.second].push_back(pr.first) ;
}
for(int i = 0 ; i <= n ; ++i)
{
if(!used[i])
dfs(i) ;
}
cout << ans.size() << '\n' ;
sort(ans.begin(),ans.end()) ;
for(int i = 0 ; i < ans.size() ; ++i)
{
cout << ans[i] << ' ' ;
}
}


+ 61
- 0
graphs/cutpoints.cpp View File

@@ -0,0 +1,61 @@
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std ;

vector <int> g[20001] ; set<int> ans ;
bool used[20001] ;
int tin[20001] , fup[20001] , timer ;

void dfs(int v, int p = -1)
{
used[v] = 1 ;
tin[v]=fup[v]=timer ,++timer ;
int children = 0 ;
for(int i = 0 ; i < g[v].size() ; ++i)
{
int u = g[v][i] ;
if(u==p)
continue ;
if(used[u])
fup[v]=min(fup[v],tin[u]) ;
else
{
dfs(u,v) ;
fup[v] = min(fup[v],fup[u]) ;
if(tin[v]<=fup[u]&&p!=-1)
{
ans.insert(v) ;
}
++children ;
}
}
if(children>1&&p==-1)
{
ans.insert(v) ;
}
}

int main()
{
freopen("points.in","r",stdin) ;
freopen("points.out","w",stdout) ;
int n , m ;
cin >> n >> m ;
for(int i = 0 ; i < m ; ++i)
{
int l , r ;
cin >> l >> r ;
g[l].push_back(r) ;
g[r].push_back(l) ;
}
for(int i = 1 ; i <= n ; ++i)
if(!used[i]) dfs(i) ;
cout << ans.size() << '\n' ;
for (std::set<int>::iterator i= ans.begin() ; i != ans.end() ; ++i)
{
cout << (*i) << ' ' ;
}
}

+ 56
- 0
graphs/dijkstra.cpp View File

@@ -0,0 +1,56 @@
#include <bits/stdc++.h>
using namespace std ;
const long long MaxN = 1e6 + 17;
const long long INF = 1e14 + 17;
long long n , m ;
vector <pair<int,int> > g[MaxN] ;
set <pair<int,int> > S ;
long long s , f ;
long long d[MaxN] ;
int main ()
{
scanf ("%d%d", &n, &m);
s = 1 ;
for (int i = 1; i <= m; ++ i) {
int x, y, w;
scanf ("%d%d%d", &x, &y, &w);
g[x].push_back (make_pair (y, w));
g[y].push_back (make_pair (x, w));
}
for (int i = 1 ; i <= n ; ++i)
d[i] = INF ;
d[s] = 0 ;
vector<int> p(n+1) ;
S.insert (make_pair (0,s)) ;
while (!S.empty()) {
int v = S.begin() -> second;
S.erase (*S.begin());
for (int i = 0 ; i < g[v].size() ; ++ i) {
int to = g[v][i].first;
int w = g[v][i].second;
if (d[v] + w < d[to])
{
S.erase(make_pair(d[to] , to)) ;
d[to] = d[v] + w ;
p[to] = v ;
S.insert(make_pair(d[to] , to)) ;
}
}
}
if(d[n] == INF)
return (cout << -1 , 0) ;
vector<int> ans ;
for(int v = n ; v != 1 ; v = p[v])
{
if(p[v] == 0)
return(cout << -1,0) ;
ans.push_back(v) ;
}
ans.push_back(1) ;
for(int i = ans.size() - 1 ; i >= 0 ; --i)
cout << ans[i] << ' ' ;
}

+ 62
- 0
graphs/lca.cpp View File

@@ -0,0 +1,62 @@
#include <bits/stdc++.h>

using namespace std ;

vector <int> g[500001] ;

int n , m , lvl[500001] , used[500001] , k , up[500001][21] ;

void dfs(int v , int p)
{
used[v] = 1 ;
up[v][0] = p ;
for (int jump = 20 ; jump >= 1 ; --jump)
up[v][jump] = up[up[v][jump-1]][jump-1] ;
for (int i = 0 ; i < g[v].size() ; ++i)
{
int to = g[v][i] ;
if (!used[to])
{
lvl[to] = lvl[v] + 1 ;
dfs(to, v) ;
}
}
}

int lca(int a , int b)
{
if (lvl[a] < lvl[b])
swap(a,b) ;
for (int jump = 20 ; jump >= 0 ; --jump)
if (lvl[up[b][jump]] >= lvl[a])
b = up[b][jump] ;
if (a == b)
return b ;
for (int jump = 20 ; jump >= 0 ; --jump)
if (up[a][jump] != up[b][jump])
a = up[a][jump] ,
b = up[b][jump] ;
return up[a][0] ;
}

main()
{
cin >> n ;
vector<pair<int,int> >z ;
for (int i = 0 ; i < n ; ++i)
{
string s ;
cin >> s ;
int a , b ;
cin >> a >> b;
if(s=="ADD")
g[a].push_back(b) ;
else
z.push_back(make_pair(a,b)) ;
}
lvl[1] = 1 ;
dfs(1, 1) ;
for (int i = 0 ; i < z.size() ; ++i)
cout << lca(z[i].first,z[i].second) << '\n' ;
}


+ 71
- 0
graphs/maxflow.cpp View File

@@ -0,0 +1,71 @@
#include <bits/stdc++.h>
#define pb push_back
#define int long long
using namespace std ;
const long long MAXN = 1e9+1 ;
const int N = (int)(2e4) + 256 ;
int n , m , timer , used[N] , lim ;
struct edge{
int v , u , c , f ;
};
vector <edge> e ;
vector <int> g[N] ;
inline void addEdge(int v , int u , int c )
{
e.pb({v,u,c,0}) ;
g[v].pb(e.size()-1) ;
e.pb({u,v,0,0}) ;
g[u].pb(e.size()-1) ;
}
int dfs ( int v , int t , int pushed = MAXN , int p = -1 )
{
if (used[v] == timer || pushed < lim) return 0;
if (!pushed || v == t) return pushed;
used[v] = timer ;
for ( int i = 0 ; i < g[v].size() ; ++i )
{
int id = g[v][i] ;
int to = e[id].u , f = e[id].f , c = e[id].c ;
if ( p == to || f == c ) continue ;
int nxt = dfs ( to , t , min ( pushed , c - f) , v);
if ( nxt > 0 )
{
e[id].f += nxt ;
e[id^1].f -= nxt ;
return nxt ;
}
}
return 0 ;
}
inline int fordf(int s,int t)
{
int res = 0 ;
lim = 1 << 30 ;
while ( lim > 0 )
{
++timer ;
int pushed = dfs(s,t) ;
if ( !pushed )
{
lim >>= 1 ;
continue ;
}
res += pushed ;
}
return res ;
}
main()
{
freopen("flow.in","r",stdin) ;
freopen("flow.out","w",stdout) ;
cin >> n >> m ;
for ( int i = 0 ; i < m ; ++i )
{
int x , y , c ;
cin >> x >> y >> c ;
addEdge(x,y,c) ;
}
cout << fordf(1,n) << endl ;
return 0 ;
}

+ 73
- 0
graphs/unionday.cpp View File

@@ -0,0 +1,73 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const float INF = 1e9+7 ;

pair<int,int> a[5001] ;
int p[5001] ;
float g[5001][5001], cost ;

int32_t main()
{
freopen("unionday.in" , "r" , stdin) ;
freopen("unionday.out" , "w" , stdout) ;
int n ;
cin >> n ;
for(int i = 0 ; i < n ; ++i)
{
cin >> a[i].F >> a[i].S ;
for(int j = 0 ; j < i ; ++j)
{
float d = (a[i].F-a[j].F)*(a[i].F-a[j].F)+(a[i].S-a[j].S)*(a[i].S-a[j].S) ;
d = sqrt(d) ;
g[i][j] = d ;
g[j][i] = d ;
}
}
vector<bool> used (n);
vector<float> min_e (n, INF);
vector<int> sel_e (n, -1);
min_e[0] = 0;
for (int i=0; i<n; ++i) {
int v = -1;
for (int j=0; j<n; ++j)
if (!used[j] && (v == -1 || min_e[j] < min_e[v]))
v = j;
if (min_e[v] == INF) {
cout << "No MST!";
exit(0);
}
used[v] = true;
if (sel_e[v] != -1)
cost += g[v][sel_e[v]];
for (int to=0; to<n; ++to)
if (g[v][to] < min_e[to]) {
min_e[to] = g[v][to];
sel_e[to] = v;
}
}
cout.precision(4) ;
cout << fixed << cost << '\n' ;
}

+ 91
- 0
math/combinatorics.cpp View File

@@ -0,0 +1,91 @@
/*
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
*/
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;
L ans[3001], anss, ansss, f[3001], pascal[3001][3001] ;
L binpow (L a, L n) {
if (n == 0)
return 1;
if (n % 2 == 1)
return (binpow (a, n-1) * a)%MOD;
else {
L b = binpow (a, n/2);
return (b * b) % MOD;
}
}
L cnk(L n, L k)
{
return (f[n] * binpow(f[k]*f[n-k]%MOD,MOD-2)) % MOD ;
}
int32_t main()
{
//freopen(".in" , "r" , stdin) ;
//freopen(".out" , "w" , stdout) ;
pascal[1][1] = 1 ;
for(int i = 1 ; i <= 3000 ; ++i)
{
for(int j = 1 ; j <= i ; ++j)
{
if(j == 1 || j == i)
pascal[i][j] = 1 ;
else
pascal[i][j] = pascal[i-1][j-1]+pascal[i-1][j], pascal[i][j] %= MOD ;
}
}

f[0] = 1 ;
for(L i = 1 ; i <= 3000 ; ++i)
f[i] = i * f[i-1], f[i] %= MOD ;
string s ;
L c ;
cin >> s >> c ;

int cnt = 0 ;
for(int i = 0 ; i < s.size() ; ++i)
if(s[i] == '1')
cnt ++ ;
for(L i = 1, j = cnt-1; i <= s.size() ; i++)
{
ans[i] = c ;
for(L j = 1 ; j < i ; ++j)
{
ans[i]+=binpow(c, j)*pascal[i][j+1];
ans[i]%=MOD;
}
if(s[s.size()-i] == '1')
anss+=ans[i]*binpow(c, j--), anss %= MOD ;
}
cout << anss+1 ;
}

+ 59
- 0
math/meet-in-the-middle.cpp View File

@@ -0,0 +1,59 @@
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = (int) 3e5 + 1;

int n, k;
ll ans;
int a[maxn], p, u[maxn];
int main(){
cin >> n >> k;
for(int i = 0; i < n; i++){
cin >> a[i];
}
p = n / 2;
for(int i = 0; i < (1 << p); i++){
ll res = 0;
for(int j = 0; j < p; j++){
if((i >> j) & 1){
res += a[j];
}
}
u[i] = res % k;
ans = max(ans, res % k);
}
sort(u, u + (1 << p));
n -= p;
for(int i = 0; i < (1 << n); i++){
ll res = 0;
for(int j = 0; j < n; j++){
if((i >> j) & 1){
res += a[j + p];
}
}
res %= k;
ans = max(ans, res);
int l = 0, r = (1 << p) - 1;
while(r - l > 1){
int mid = (l + r) / 2;
if(u[mid] + res >= k){
r = mid;
}
else {
l = mid;
}
}
int p1 = 0;
if(u[l] + res >= k){
p1 = l;
}
else {
p1 = r;
}
ans = max(ans, (u[(1 << p) - 1] + res) % k);
ans = max(ans, (u[p1 - 1] + res) % k);
}
cout << ans;
}

+ 20
- 0
math/pascaltriangle.cpp View File

@@ -0,0 +1,20 @@
#include <bits/stdc++.h>

using namespace std ;

long long c[200][20000] ;

main()
{
freopen("combination.in","r",stdin) ;
freopen("combination.out","w",stdout) ;
int n , k ;
cin >> n >> k;
for(int i = 0 ; i <= n ; ++i)
{
c[i][0] = 1 ; c[i][i] = 1 ;
for(int j = 1 ; j < i ; ++j)
c[i][j] = c[i-1][j-1]+c[i-1][j] ;
}
cout << c[n][k] ;
}

+ 118
- 0
math/two-turtles.cpp View File

@@ -0,0 +1,118 @@
#pragma GCC target ("avx2")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#include "bits/stdc++.h"
#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define BIT(x) __builtin_popcount(x)
#define all(x) x.begin() , x.end()
#define F first
#define S second
#define pb push_back
using namespace std ;
typedef unsigned long long UL ;
typedef long long L ;
typedef string T ;
typedef int I ;
const I MaxN = 1e5+1 ;
const I MOD = 1e9+7 ;
const I inf = 2e9+7 ;
const L INF = 2e18+7 ;
char c[3001][3001] ;
L dp[3001][3001], pd[3001][3001] ;
bool ok[3001][3001], ok2[3001][3001] ;
int32_t main()
{
iosb ;
int n, m ;
cin >> n >> m ;
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
cin >> c[i][j] ;
dp[2][1] = 1, pd[1][2] = 1 ;
if(c[2][1]!='#')
ok[2][1] = 1, ok2[2][1] = 1 ;
if(c[1][2]!='#')
ok[1][2] = 1, ok2[1][2] = 1 ;
for(int i = 2 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
{
if(i==2&&j==1)
continue ;
if(i==2)
{
if(c[i][j] == '#')
ok[i][j] = 0 ;
else if(!ok[i][j-1])
ok[i][j] = 0 ;
else
dp[i][j] = dp[i][j-1], dp[i][j]%=MOD, ok[i][j] = 1 ;
continue ;
}
if(j==1)
{
if(c[i][j] == '#')
ok[i][j] = 0 ;
else if(!ok[i-1][j])
ok[i][j] = 0 ;
else
dp[i][j] = dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ;
continue ;
}
if(c[i][j] == '#')
ok[i][j] = 0 ;
else if(!ok[i][j-1] && !ok[i-1][j])
ok[i][j] = 0 ;
else
dp[i][j] = dp[i][j-1] + dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ;
}
for(int i = 1 ; i <= n ; ++i)
for(int j = 2 ; j <= m ; ++j)
{
if(i==1&&j==2)
continue ;
if(i==1)
{
if(c[i][j] == '#')
ok2[i][j] = 0 ;
else if(!ok2[i][j-1])
ok2[i][j] = 0 ;
else
pd[i][j] = pd[i][j-1], pd[i][j]%=MOD, ok2[i][j] = 1 ;
continue ;
}
if(j==2)
{
if(c[i][j] == '#')
ok2[i][j] = 0 ;
else if(!ok2[i-1][j])
ok2[i][j] = 0 ;
else
pd[i][j] = pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ;
continue ;
}
if(c[i][j] == '#')
ok2[i][j] = 0 ;
else if(!ok2[i][j-1] && !ok2[i-1][j])
ok2[i][j] = 0 ;
else
pd[i][j] = pd[i][j-1] + pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ;
}
if(ok[n][m-1] && ok2[n-1][m])
{
L ans = (((dp[n][m-1]*pd[n-1][m])%MOD)-((dp[n-1][m]*pd[n][m-1])%MOD)) ;
if(ans<0)
ans = MOD+ans ;
cout << ans << '\n' ;
}
else
cout << 0 << '\n' ;
}

BIN
other/ioi-ideas.pdf View File


Loading…
Cancel
Save