如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
队伍人不齐打这场真心累啊…
BE, GE or NE
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000 + 10;
int f[maxn][210];
int a[maxn], b[maxn], c[maxn];
int n, m, k, l;
int main()
{
scanf("%d%d%d%d", &n, &m, &k, &l);
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &a[i], &b[i], &c[i]);
for (int i = 0; i <= l + 100; i++)
f[n + 1][i] = -1;
for (int i = l + 101; i < k + 100; i++)
f[n + 1][i] = 0;
for (int i = k + 100; i <= 200; i++)
f[n + 1][i] = 1;
for (int i = n; i >= 1; i--)
{
// for (int w=90;w<110;w++) printf("%d",f[i+1][w]);
// printf("\n");
for (int j = 0; j <= 200; j++)
{
int x = -1, y = -1, z = -1;
if (a[i])
{
x = j + a[i];
if (x > 200)
x = 200;
}
if (b[i])
{
y = j - b[i];
if (y < 0)
y = 0;
}
if (c[i])
z = 200 - j;
if (i & 1)
{
if ((x >= 0) && (f[i + 1][x] == 1))
{
f[i][j] = 1;
continue;
}
if ((y >= 0) && (f[i + 1][y] == 1))
{
f[i][j] = 1;
continue;
}
if ((z >= 0) && (f[i + 1][z] == 1))
{
f[i][j] = 1;
continue;
}
if (((x < 0) || ((x >= 0) && (f[i + 1][x] == -1))) && ((y < 0) || ((y >= 0) && (f[i + 1][y] == -1))) && ((z < 0) || ((z >= 0) && (f[i + 1][z] == -1))))
{
f[i][j] = -1;
continue;
}
f[i][j] = 0;
}
else
{
if ((x >= 0) && (f[i + 1][x] == -1))
{
f[i][j] = -1;
continue;
}
if ((y >= 0) && (f[i + 1][y] == -1))
{
f[i][j] = -1;
continue;
}
if ((z >= 0) && (f[i + 1][z] == -1))
{
f[i][j] = -1;
continue;
}
if (((x < 0) || ((x >= 0) && (f[i + 1][x] == 1))) && ((y < 0) || ((y >= 0) && (f[i + 1][y] == 1))) && ((z < 0) || ((z >= 0) && (f[i + 1][z] == 1))))
{
f[i][j] = 1;
continue;
}
f[i][j] = 0;
}
}
}
if (f[1][m + 100] == 1)
printf("Good Ending");
else if (f[1][m + 100] == 0)
printf("Normal Ending");
else
printf("Bad Ending");
}
Features Track
#include <cstdio>
#include <unordered_map>
using namespace std;
int t, n;
int main()
{
for (scanf("%d", &t); t--;)
{
scanf("%d", &n);
unordered_map<int, unordered_map<int, pair<int, int>>> mp;
int ans = 0;
for (int i = 1, k, x, y; i <= n; ++i)
for (scanf("%d", &k); k--;)
{
scanf("%d%d", &x, &y);
pair<int, int> &p = mp[x][y];
if (p.first == i)
continue; //坑
if (p.first != i - 1)
p.second = 0;
p.first = i, ans = max(ans, ++p.second);
}
if (ans == 1)
ans = 0; //坑
printf("%d\n", ans);
}
}
Trace
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 200000 + 10;
struct node
{
int l, r, mx;
} t[maxn * 4];
int n;
long long ans;
int x[maxn], y[maxn], tmp1[maxn], tmp2[maxn];
void build(int cur, int l, int r)
{
t[cur].l = l;
t[cur].r = r;
t[cur].mx = 0;
if (l == r)
return;
int mid = (l + r) / 2;
build(cur * 2, l, mid);
build(cur * 2 + 1, mid + 1, r);
}
void update(int cur, int l, int r, int v)
{
if ((t[cur].l == l) && (t[cur].r == r))
{
t[cur].mx = max(t[cur].mx, v);
return;
}
t[cur * 2].mx = max(t[cur * 2].mx, t[cur].mx);
t[cur * 2 + 1].mx = max(t[cur * 2 + 1].mx, t[cur].mx);
t[cur].mx = 0;
int mid = (t[cur].l + t[cur].r) / 2;
if (r <= mid)
update(cur * 2, l, r, v);
else if (l > mid)
update(cur * 2 + 1, l, r, v);
else
update(cur * 2, l, mid, v), update(cur * 2 + 1, mid + 1, r, v);
}
int query(int cur, int pos)
{
if (t[cur].l == t[cur].r)
return t[cur].mx;
t[cur * 2].mx = max(t[cur * 2].mx, t[cur].mx);
t[cur * 2 + 1].mx = max(t[cur * 2 + 1].mx, t[cur].mx);
t[cur].mx = 0;
int mid = (t[cur].l + t[cur].r) / 2;
if (pos <= mid)
return query(cur * 2, pos);
else
return query(cur * 2 + 1, pos);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &x[i], &y[i]);
for (int i = 1; i <= n; i++)
tmp1[i] = x[i];
sort(tmp1 + 1, tmp1 + n + 1);
for (int i = 1; i <= n; i++)
x[i] = lower_bound(tmp1 + 1, tmp1 + n + 1, x[i]) - tmp1;
for (int i = 1; i <= n; i++)
tmp2[i] = y[i];
sort(tmp2 + 1, tmp2 + n + 1);
for (int i = 1; i <= n; i++)
y[i] = lower_bound(tmp2 + 1, tmp2 + n + 1, y[i]) - tmp2;
ans = 0;
build(1, 1, n);
for (int i = n; i >= 1; i--)
{
int k = query(1, y[i]);
ans += tmp1[x[i]] - tmp1[k];
update(1, 1, y[i], x[i]);
}
build(1, 1, n);
for (int i = n; i >= 1; i--)
{
int k = query(1, x[i]);
ans += tmp2[y[i]] - tmp2[k];
update(1, 1, x[i], y[i]);
}
printf("%lld", ans);
return 0;
}
Ryuji doesn’t want to study
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
struct SegmentTree
{
struct Node
{
ll set, sum, ans;
};
vector<Node> v;
int LAST, L, R;
SegmentTree(int n) : LAST(n), v(2 * n + 1) {}
void build(ll a[], int l, int r)
{
if (l < r)
{
int m = l + (r - l) / 2;
build(a, l, m), build(a, m + 1, r);
lv(l, r).set = INF;
}
else
lv(l, r).set = a[l];
maintain(l, r);
}
Node &lv(int l, int r)
{
return v[l + r | l != r];
}
void push_down(Node &lc, Node &rc, Node &fa)
{
if (fa.set != INF)
lc.set = rc.set = fa.set, fa.set = INF;
}
void push_up(const Node &lc, const Node &rc, Node &fa, int l, int r, int m)
{
fa.sum = lc.sum + rc.sum;
fa.ans = lc.ans + rc.ans + lc.sum * (r - m);
}
void maintain(int l, int r)
{
if (l < r)
{
int m = l + (r - l) / 2;
push_up(lv(l, m), lv(m + 1, r), lv(l, r), l, r, m);
}
if (lv(l, r).set != INF)
{
int len = r - l + 1;
lv(l, r).sum = len * lv(l, r).set;
lv(l, r).ans = (1LL + len) * len / 2 * lv(l, r).set;
}
}
Node ask(int l, int r, ll val = 0, bool out = 1)
{
if (out)
return L = l, R = r, ask(1, LAST, val, 0);
if (lv(l, r).set != INF)
{
int len = min(R, r) - max(l, L) + 1;
v[0].sum = len * lv(l, r).set;
v[0].ans = (1LL + len) * len / 2 * lv(l, r).set;
}
else if (L <= l && r <= R)
v[0] = lv(l, r);
else
{
int m = l + (r - l) / 2;
if (R <= m)
return ask(l, m, val, 0);
if (L > m)
return ask(m + 1, r, val, 0);
push_up(ask(l, m, val, 0), ask(m + 1, r, val, 0), v[0], max(L, l), min(R, r), m);
}
return v[0];
}
void set(int l, int r, ll val, bool out = 1)
{
if (out)
return L = l, R = r, set(1, LAST, val, 0);
if (L <= l && r <= R)
lv(l, r).set = val;
else
{
int m = l + (r - l) / 2;
push_down(lv(l, m), lv(m + 1, r), lv(l, r));
if (L <= m)
set(l, m, val, 0);
else
maintain(l, m);
if (R > m)
set(m + 1, r, val, 0);
else
maintain(m + 1, r);
}
maintain(l, r);
}
};
ll n, q, a[100009];
int main()
{
scanf("%lld%lld", &n, &q);
for (ll i = 1; i <= n; ++i)
scanf("%lld", &a[i]);
SegmentTree tree(n);
tree.build(a, 1, n);
for (ll i = 0, a, b, c; i < q; ++i)
{
scanf("%lld%lld%lld", &a, &b, &c);
if (a == 1)
printf("%lld\n", tree.ask(b, c).ans);
if (a == 2)
tree.set(b, b, c);
}
}
Characters with Hash
#include <cstdio>
using namespace std;
char s[1000009], z[9];
int t, n, ans;
int main()
{
for (scanf("%d", &t); t--;)
{
scanf("%d%s%s", &n, z, s);
for (int i = ans = 0, tmp, flag = 0; i < n; ++i)
{
if (tmp = (int)z[0] - (int)s[i], tmp < 0)
tmp = -tmp;
if (flag)
ans += 2;
else if (tmp)
for (flag = 1; tmp; tmp /= 10)
++ans;
}
if (ans == 0)
ans = 1; //坑
printf("%d\n", ans);
}
}