Skip to content
Snippets Groups Projects
Commit 072f9fe1 authored by Bruno Freitas Tissei's avatar Bruno Freitas Tissei
Browse files

Merge branch 'master' into 'refactor'

# Conflicts:
#   algorithms/math/matrix.cpp
parents e9fc13d1 f921a2d9
No related branches found
No related tags found
1 merge request!1Refactor algorithms and add some stuff
......@@ -25,13 +25,15 @@
* [x1 x2]^n
* [ 1 0]
*/
matrix solve(ll x, ll y, ll n) {
matrix in(2);
template <typename T>
matrix<T> solve(ll x, ll y, ll n) {
matrix<T> in(2);
// Example
in[0][0] = x % MOD;
in[0][1] = y % MOD;
in[1][0] = 1;
in[1][1] = 0;
return fast_pow(in, n);
return fast_pow<T>(in, n);
}
......@@ -2,20 +2,21 @@
* Matrix
*/
struct Matrix {
template <typename T>
struct matrix {
int r, c;
vector<vector<ll>> m;
vector<vector<T>> m;
Matrix(int k) : r(k), c(k) {
m = vector<vector<ll>>(k, vector<ll>(k, 0));
matrix(int k) : r(k), c(k) {
m = vector<vector<T>>(k, vector<T>(k, 0));
}
Matrix(int r, int c) : r(r), c(c) {
m = vector<vector<ll>>(r, vector<ll>(c, 0));
matrix(int r, int c) : r(r), c(c) {
m = vector<vector<T>>(r, vector<T>(c, 0));
}
Matrix operator*(Matrix a) {
assert(r == a.c && c = a.r);
matrix operator*(matrix a) {
assert(r == a.c && c == a.r);
Matrix res(r, c);
for (int i = 0; i < r; i++)
......@@ -47,11 +48,7 @@ struct Matrix {
m[i][i] = 1;
}
ll *operator[](int i) {
vector<T> &operator[](int i) {
return m[i];
}
void clear() {
mset(m, 0);
}
};
/**
* Sqrt Decomposition
*
* Complexity (time):
* Preprocess -> O(n)
* Query -> O(sqrt(n))
* Update -> O(1)
* Complexity (space): O(n)
*/
int v[MAX];
int block[MAX];
int block_size;
/**
* Update v[idx] with val.
* @param idx index of v
* @param val new value of v[idx]
*/
void update(int idx, int val) {
block[idx / block_size] += val - v[idx];
v[idx] = val;
}
/**
* Range sum query of v[l..r].
* @param l,r range
*/
int query(int l, int r) {
int ans = 0;
// Query sum of elements in case l is inside a block
for (; l < r && ((l % block_size) != 0); ++l)
ans += v[l];
// Query sum of each block between l and r
for (; l + block_size <= r; l += block_size)
ans += block[l / block_size];
// Query sum of remaining blocks (e.g. r is inside a block)
for (; l <= r; ++l)
ans += v[l];
return ans;
}
/**
* Fills block array with necessary data to perform update and query in
* less than linear time.
* @param n number of elements of v
*/
void preprocess(int n) {
block_size = sqrt(n);
int idx = -1;
for (int i = 0; i < n; ++i) {
if (i % block_size == 0)
block[++idx] = 0;
block[idx] += v[i];
}
}
#include <bits/stdc++.h>
#define EPS 1e-6
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define pb push_back
#define ende '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define mset(x, y) memset(&x, (y), sizeof(x))
using namespace std;
typedef unsigned long long ll;
typedef pair<int,int> ii;
struct matrix {
int N;
ll b;
vector<vector<ll>> m;
matrix(int N, ll b) : N(N), b(b) {
m = vector<vector<ll>>(N, vector<ll>(N, 0));
}
matrix operator*(matrix a) {
matrix res(N, b);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
res[i][j] = 0;
for (int k = 0; k < N; k++)
res[i][j] = (((m[i][k] * a[k][j]) % b) + res[i][j]) % b;
}
return res;
}
void to_identity() {
for (auto &i : m)
fill(all(i), 0);
for (int i = 0; i < N; ++i)
m[i][i] = 1;
}
vector<ll> &operator[](int i) {
return m[i];
}
};
ll fast_pow(matrix in, ll n, ll b) {
matrix ans(2, b);
ans.to_identity();
while (n) {
if (n & 1)
ans = ans * in;
n >>= 1;
in = in * in;
}
return ans[0][0];
}
ll solve(ll n, ll b) {
matrix in(2, b);
in[0][0] = 1;
in[0][1] = 1;
in[1][0] = 1;
in[1][1] = 0;
return fast_pow(in, n, b);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll n, b;
int cas = 1;
while (cin >> n >> b && (n || b)) {
ll ans = solve(n, b) % b;
ans = (ans + ans) % b;
ans = (ans - 1 + b) % b;
cout << "Case " << cas++ << ":" << " " << n << " " << b << " " << ans << ende;
}
return 0;
}
#include <bits/stdc++.h>
#define EPS 1e-6
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define pb push_back
#define ende '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define mset(x, y) memset(&x, (y), sizeof(x))
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
for (int cas = 1; cas <= t; ++cas) {
int d; cin >> d;
string s; cin >> s;
int n = s.size();
vector<ll> v(n);
int nums = 0;
ll curr = 1, sum = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == 'S') {
sum += curr;
nums++;
} else curr <<= 1;
v[i] = curr;
}
cout << "Case #" << cas << ": ";
if (nums > d) {
cout << "IMPOSSIBLE" << ende;
continue;
}
int ans = 0;
int i = n - 2;
while (sum > d) {
if (i <= n - 2 && s[i] == 'C' && s[i+1] == 'S') {
sum -= v[i];
v[i] >>= 1;
sum += v[i];
swap(s[i], s[i+1]);
ans++;
i++;
} else
i--;
}
cout << ans << ende;
}
return 0;
}
#include <bits/stdc++.h>
#define EPS 1e-6
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define pb push_back
#define ende '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define mset(x, y) memset(&x, (y), sizeof(x))
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
for (int cas = 1; cas <= t; ++cas) {
int n; cin >> n;
vector<int> v(n);
for (auto &i : v) cin >> i;
vector<int> v1, v2;
for (int i = 0; i < n; ++i)
if (i % 2) v2.pb(v[i]);
else v1.pb(v[i]);
sort(all(v1));
sort(all(v2));
int j = 0;
for (auto i : v1) {
v[j] = i;
j += 2;
}
j = 1;
for (auto i : v2) {
v[j] = i;
j += 2;
}
int ans = -1;
for (int i = 0; i < n - 1; ++i) {
if (v[i] > v[i+1]) {
ans = i;
break;
}
}
cout << "Case #" << cas << ": ";
if (ans == -1) cout << "OK" << ende;
else cout << ans << ende;
}
return 0;
}
#include <bits/stdc++.h>
#define EPS 1e-6
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define pb push_back
#define ende '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define mset(x, y) memset(&x, (y), sizeof(x))
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
int v[3][3];
int m[1001][1001];
bool check() {
return (v[0][0] && v[0][1] && v[0][2]);
}
int count() {
int num = 0;
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
num += !v[i][j];
return num;
}
void move(int &line) {
line++;
for (int i = 0; i < 3; ++i) v[0][i] = v[1][i];
for (int i = 0; i < 3; ++i) v[1][i] = v[2][i];
for (int i = 0; i < 3; ++i) v[2][i] = 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
for (int cas = 1; cas <= t; ++cas) {
int a; cin >> a;
int line = 2;
int num = 0;
mset(v, 0);
mset(m, 0);
while (true) {
while (check() && line < 1000) {
if (count() + num >= a) break;
move(line);
}
cout << line << " " << 2 << ende;
cout << flush;
int x, y; cin >> x >> y;
if (x == 0 && y == 0)
break;
if (!m[x][y]) num++;
m[x][y] = 1;
assert(x != -1 && y != -1);
v[x - line + 1][y - 1] = 1;
}
}
return 0;
}
......@@ -45,7 +45,6 @@ bool solve(int i, int r) {
return dp[i][r] = false;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
......
......@@ -33,14 +33,12 @@ void make_set(int x) {
size[x] = 1;
}
int find_set(int x) {
if (pare[x] != x)
pare[x] = find_set(pare[x]);
return pare[x];
}
void union_set(int x, int y) {
x = find_set(x);
y = find_set(y);
......@@ -55,7 +53,6 @@ void union_set(int x, int y) {
size[y] += size[x];
}
int kruskal() {
sort(all(edges), [&](const iii &a, const iii &b) {
return a.se < b.se;
......@@ -107,14 +104,12 @@ void dfs(int v, int p = -1, int c = 0) {
dfs(u.fi, v, u.se);
}
void preprocess(int v) {
memset(par, -1, sizeof par);
memset(cost, 0, sizeof cost);
dfs(v);
}
int query(int p, int q) {
int ans = 0;
......@@ -141,7 +136,6 @@ int query(int p, int q) {
else return max(ans, max(cost[p][0], cost[q][0]));
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment