Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • bft15/algorithms
1 result
Select Git revision
Show changes
Commits on Source (5)
...@@ -25,13 +25,15 @@ ...@@ -25,13 +25,15 @@
* [x1 x2]^n * [x1 x2]^n
* [ 1 0] * [ 1 0]
*/ */
matrix solve(ll x, ll y, ll n) { template <typename T>
matrix in(2); matrix<T> solve(ll x, ll y, ll n) {
matrix<T> in(2);
// Example
in[0][0] = x % MOD; in[0][0] = x % MOD;
in[0][1] = y % MOD; in[0][1] = y % MOD;
in[1][0] = 1; in[1][0] = 1;
in[1][1] = 0; in[1][1] = 0;
return fast_pow(in, n); return fast_pow<T>(in, n);
} }
...@@ -2,20 +2,21 @@ ...@@ -2,20 +2,21 @@
* Matrix * Matrix
*/ */
template <typename T>
struct matrix { struct matrix {
int r, c; int r, c;
vector<vector<ll>> m; vector<vector<T>> m;
matrix(int k) : r(k), c(k) { matrix(int k) : r(k), c(k) {
m = vector<vector<ll>>(k, vector<ll>(k, 0)); m = vector<vector<T>>(k, vector<T>(k, 0));
} }
matrix(int r, int c) : r(r), c(c) { matrix(int r, int c) : r(r), c(c) {
m = vector<vector<ll>>(r, vector<ll>(c, 0)); m = vector<vector<T>>(r, vector<T>(c, 0));
} }
matrix operator*(matrix a) { matrix operator*(matrix a) {
assert(r == a.c && c = a.r); assert(r == a.c && c == a.r);
matrix res(r, c); matrix res(r, c);
for (int i = 0; i < r; i++) for (int i = 0; i < r; i++)
...@@ -47,11 +48,7 @@ struct matrix { ...@@ -47,11 +48,7 @@ struct matrix {
m[i][i] = 1; m[i][i] = 1;
} }
ll *operator[](int i) { vector<T> &operator[](int i) {
return m[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) { ...@@ -45,7 +45,6 @@ bool solve(int i, int r) {
return dp[i][r] = false; return dp[i][r] = false;
} }
int main() { int main() {
ios::sync_with_stdio(0); ios::sync_with_stdio(0);
cin.tie(0); cin.tie(0);
......
...@@ -33,14 +33,12 @@ void make_set(int x) { ...@@ -33,14 +33,12 @@ void make_set(int x) {
size[x] = 1; size[x] = 1;
} }
int find_set(int x) { int find_set(int x) {
if (pare[x] != x) if (pare[x] != x)
pare[x] = find_set(pare[x]); pare[x] = find_set(pare[x]);
return pare[x]; return pare[x];
} }
void union_set(int x, int y) { void union_set(int x, int y) {
x = find_set(x); x = find_set(x);
y = find_set(y); y = find_set(y);
...@@ -55,7 +53,6 @@ void union_set(int x, int y) { ...@@ -55,7 +53,6 @@ void union_set(int x, int y) {
size[y] += size[x]; size[y] += size[x];
} }
int kruskal() { int kruskal() {
sort(all(edges), [&](const iii &a, const iii &b) { sort(all(edges), [&](const iii &a, const iii &b) {
return a.se < b.se; return a.se < b.se;
...@@ -107,14 +104,12 @@ void dfs(int v, int p = -1, int c = 0) { ...@@ -107,14 +104,12 @@ void dfs(int v, int p = -1, int c = 0) {
dfs(u.fi, v, u.se); dfs(u.fi, v, u.se);
} }
void preprocess(int v) { void preprocess(int v) {
memset(par, -1, sizeof par); memset(par, -1, sizeof par);
memset(cost, 0, sizeof cost); memset(cost, 0, sizeof cost);
dfs(v); dfs(v);
} }
int query(int p, int q) { int query(int p, int q) {
int ans = 0; int ans = 0;
...@@ -141,7 +136,6 @@ int query(int p, int q) { ...@@ -141,7 +136,6 @@ int query(int p, int q) {
else return max(ans, max(cost[p][0], cost[q][0])); else return max(ans, max(cost[p][0], cost[q][0]));
} }
int main() { int main() {
ios::sync_with_stdio(0); ios::sync_with_stdio(0);
cin.tie(0); cin.tie(0);
......