treeman667
some guy stole my name 😡
State Space Tree
Pruning
Backtracking
Bitmask
Meet in the Middle
Merge Sort
Binary Search
Sparse Table
Binary Lifting
Segment Tree
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, m;
cin >> h >> m;
vector<string> grid(h);
for (int i=0; i < h; i++)
cin >> grid[i];
set<vector<string>> saves;
for (int i=0; i <= (h-m); i++)
for (int j=0; j <= (h-m); j++)
{
vector<string> g(m);
for (int ti = 0; ti < m; ti++)
for (int tj = 0; tj < m; tj++)
g[ti].push_back(grid[i+ti][j+tj]);
saves.insert(g);
}
cout << saves.size();
}
# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
vector<vector<char>> saves(8, vector <char> (8));
unordered_map<int, int> pieces;
int ans = 0;
bool check_valid(int y, int x)
{
if(saves[y][x] != '*')
{
for (int i=0; i < y; i++)
{
if (pieces[i] - x == i - y)
return false;
if (pieces[i] == x)
return false;
if (pieces[i] + i == x + y)
return false;
}
return true;
}
else
return false;
}
void solution(int row)
{
if (row == 8)
{
ans++;
return;
}
for (int i=0; i < 8; i++)
{
if (!check_valid(row, i))
continue;
pieces[row] = i;
solution(row + 1);
pieces.erase(row);
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
for (int i=0; i < 8; i++)
for (auto &x : saves[i])
cin >> x;
solution(0);
cout << ans;
}
# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
int n;
cin >> n;
vector<ll> saves(n);
for (int i = 0; i < n; i++)
cin >> saves[i];
ll total = accumulate(saves.begin(), saves.end(), 0LL);
ll ans = LLONG_MAX;
for (int mask = 0; mask < (1 << n); mask++)
{
ll sum1 = 0;
for (int i = 0; i < n; i++)
if (mask & (1 << i))
sum1 += saves[i];
ll sum2 = total - sum1;
ans = min(ans, abs(sum1 - sum2));
}
cout << ans << '\n';
}
# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
string s;
bool visited[7][7];
int ans = 0;
void dfs(int i, int j, int steps = 0)
{
if (i == 6 && j == 0)
{
if (steps != 48)
return;
++ans;
}
if ((i == 0 || visited[i - 1][j]) && (i == 6 || visited[i + 1][j]) && j > 0 && j < 6 && !visited[i][j - 1] && !visited[i][j + 1])
{
visited[i][j] = false;
return;
}
if ((j == 0 || visited[i][j - 1]) && (j == 6 || visited[i][j + 1]) && i > 0 && i < 6 && !visited[i - 1][j] && !visited[i + 1][j])
{
visited[i][j] = false;
return;
}
visited[i][j] = true;
if (s[steps] == '?' || s[steps] == 'U')
if ( i && !visited[i-1][j])
dfs(i-1, j, steps + 1);
if (s[steps] == '?' || s[steps] == 'D')
if ( i < 6 && !visited[i+1][j])
dfs(i+1, j, steps + 1);
if (s[steps] == '?' || s[steps] == 'L')
if ( j && !visited[i][j-1])
dfs(i, j-1, steps + 1);
if (s[steps] == '?' || s[steps] == 'R')
if ( j < 6 && !visited[i][j+1])
dfs(i, j+1, steps + 1);
visited[i][j] = false;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
dfs(0, 0);
cout << ans;
}
# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
// struct ListNode
// {
// int val;
// ListNode *next;
// ListNode() : val(0), next(nullptr) {}
// ListNode(int x) : val(x), next(nullptr) {}
// ListNode(int x, ListNode *next) : val(x), next(next) {}
// };
class Solution {
public:
ListNode* sortList(ListNode* head)
{
if (!head || !head->next) return head;
auto slow = head, fast = head->next;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
auto mid = slow->next;
slow->next = nullptr;
return merge(sortList(head), sortList(mid));
}
private:
ListNode* merge(ListNode* l, ListNode* r)
{
ListNode dummy;
ListNode* tail = &dummy;
while (l && r)
{
if (l->val > r->val) swap(l, r);
tail->next = l;
l = l->next;
tail = tail->next;
}
if (l) tail->next = l;
if (r) tail->next = r;
return dummy.next;
}
};
# PRESENTING CODE
using ll = long long;
class Solution
{
public:
int countRangeSum(vector<int>& nums, int lower, int upper)
{
int n = nums.size();
vector<ll> prefix(n+1);
for (int i=0; i < n; i++) prefix[i+1] = prefix[i] + nums[i];
return sort(prefix, 0, n+1, lower, upper);
}
int sort(vector<ll> &prefix, int l, int r, int &lower, int &upper)
{
if (r - l <= 1) return 0;
int mid = (l + r) >> 1;
int count = sort(prefix, l, mid, lower, upper) + sort(prefix, mid, r, lower, upper);
int j = mid, k = mid;
for (int i=l; i < mid; i++)
{
while (k < r && prefix[k] - prefix[i] < lower) k++;
while (j < r && prefix[j] - prefix[i] <= upper) j++;
count += j-k;
}
inplace_merge(prefix.begin()+l, prefix.begin()+mid, prefix.begin()+r);
return count;
}
};
# PRESENTING CODE
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
int n, q;
cin >> n >> q;
int b = sqrt(n) + 1;
int saves[n], blocks[b];
memset(blocks, 0x3f, sizeof(blocks));
for (int i=0; i < n; i++)
cin >> saves[i], blocks[i/b] = min(blocks[i/b], saves[i]);
while (q--)
{
int l, r;
cin >> l >> r;
--l, --r;
int ans = INT_MAX;
for (int i=l; i <= r;)
if (i % b == 0 && i + b - 1 <= r)
ans = min(ans, blocks[i/b]), i += b;
else
ans = min(ans, saves[i]), ++i;
cout << ans << '\n';
}
}
# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
int n, q;
const int MAXN = 2e5 * 4 + 10;
static int saves[MAXN];
static int st[MAXN];
void build(int v, int tl, int tr)
{
if (tl == tr)
st[v] = saves[tl];
else
{
int m = (tl + tr) >> 1;
build(v*2, tl, m), build(v*2 + 1, m+1, tr);
st[v] = min(st[v*2], st[v*2 + 1]);
}
}
int getmin(int v, int l, int r, int tl = 1, int tr = n)
{
if (tl > r || tr < l)
return INT_MAX;
if (l <= tl && tr <= r)
return st[v];
int m = (tl + tr) >> 1;
return min(getmin(v*2, l, r, tl, m), getmin(v*2 + 1, l, r, m+1, tr));
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> q;
for (int i=1; i <= n; i++)
cin >> saves[i];
build(1, 1, n);
while (q--)
{
int b, c;
cin >> b >> c;
cout << getmin(1, b, c) << '\n';
}
}
# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 114514;
static int st[22][MAXN+5];
int main()
{
int n, q;
cin >> n >> q;
for (int i=0; i < n; i++)
cin >> st[0][i];
for (int i=1; (1 << i) <= n; i++)
for (int j=0; j + (1 << i) - 1 <= n; j++)
st[i][j] = min(st[i-1][j], st[i-1][j + (1 << (i-1))]);
while (q--)
{
int l, r;
cin >> l >> r;
l--, r--;
int k = __lg(r-l + 1);
cout << min(st[k][l], st[k][r-(1 << k) + 1]) << '\n';
}
}
# PRESENTING CODE
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#define int long long
using ll = long long;
const int MAXN = 2e5 + 67;
int n, q;
struct seg
{
int r;
ll c;
} jp[21][MAXN];
ll pref[MAXN], npref[MAXN];
int saves[MAXN];
signed main()
{
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> q;
for (int i=1; i <= n; i++)
cin >> saves[i], pref[i] = pref[i-1] + saves[i];
stack<int> st;
for (int i=1; i <= n; st.push(i), i++)
while (!st.empty() && saves[i] > saves[st.top()])
jp[0][st.top()] = {i, saves[st.top()] * (i - st.top() - 1) - (pref[i-1] - pref[st.top()])}, st.pop();
for (int i=1; i <= 20; ++i)
for (int j=1; j <= n; j++)
jp[i][j] = {jp[i-1][jp[i-1][j].r].r, jp[i-1][j].c + jp[i-1][jp[i-1][j].r].c};
while (q--)
{
int a, b;
cin >> a >> b;
ll ans = 0;
if (a == b) { cout << ans << '\n'; continue;}
int h = saves[a];
for (int i = __lg(b-a); i >= 0; --i)
if (jp[i][a].r != 0 && jp[i][a].r <= b)
ans += jp[i][a].c, a = jp[i][a].r, h = saves[a];
cout << ans + 1LL * h * (b-a) - (pref[b] - pref[a]) << '\n';
}
}
# PRESENTING CODE
By treeman667