2017 ACM/ICPC Asia Regional Guangxi Online 记录
题目链接 Guangxi
感觉这场比赛完全是读题场啊……
比赛过程中丢失了一波进度,最后想开题的时候已经来不及了……
Problem A
按题意模拟……按照那个矩阵算就可以了
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) double a[10][10]; int b[100010]; char s[100010]; int main(){ rep(i, 1, 4) rep(j, 1, 4) cin >> a[i][j]; getchar(); fgets(s, 100010, stdin); int len = strlen(s); int n = 0; rep(i, 0, len - 1){ if (s[i] >= '0' && s[i] <= '9'){ ++n; b[n] = s[i] - 48; } } double gg = 1.0000000; rep(i, 1, n - 1) gg = gg * a[b[i]][b[i + 1]]; printf("%.8f\n", gg); fgets(s, 100010, stdin); len = strlen(s); n = 0; rep(i, 0, len - 1){ if (s[i] >= '0' && s[i] <= '9'){ ++n; b[n] = s[i] - 48; } } gg = 1.0000000; rep(i, 1, n - 1) gg = gg * a[b[i]][b[i + 1]]; printf("%.8f\n", gg); int kk; scanf("%d", &kk); gg = 1.00 / (1 - a[kk][kk]); printf("%.8f\n", gg); scanf("%d", &kk); gg = 1.00 / (1 - a[kk][kk]); printf("%.8f\n", gg); return 0; }
Problem C
这道题限制条件比较多,比赛的最后一分钟才通过
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se second typedef long long LL; typedef pair <int, int> PII; const int N = 2010000; vector <PII > a; int n, m; int ans[N]; int q; bool cmp(PII a, PII b){ return a.fi == b.fi ? a.se < b.se : a.fi > b.fi; } int main(){ scanf("%d%d", &n, &m); rep(i, 1, n){ a.clear(); int x; scanf("%d", &x); int xx, yy; int cnt = 0; while (true){ scanf("%d", &xx); if (xx == -1) break; scanf("%d", &yy); if (yy < x) continue; ++cnt; a.push_back({yy, xx}); } if (cnt == 0) continue; sort(a.begin(), a.end(), cmp); int uu = a[0].se; int hhhh = 0; if (cnt == 1) hhhh = x; else hhhh = a[1].fi; int tt = hhhh * 1.1000; int ff = min(tt, a[0].fi); ans[uu] += (int)ff; } scanf("%d", &q); while (q--){ int k; scanf("%d", &k); printf("%d\n", ans[k]); } return 0; }
Problem F
求矩形面积并 模板题
#include <bits/stdc++.h> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 typedef long long LL; const LL N = 1e5 + 10; int n; struct Seg { double l, r, h; LL d; Seg() {} Seg(double l, double r, double h, LL d): l(l), r(r), h(h), d(d) {} bool operator< (const Seg& rhs) const {return h < rhs.h;} } a[N]; LL cnt[N << 2]; LL sum[N << 2], all[N]; void push_up(LL l, LL r, LL rt){ if (cnt[rt]) sum[rt] = all[r + 1] - all[l]; else if(l == r) sum[rt] = 0; //leaves have no sons else sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void update(LL L, LL R, LL v, LL l, LL r, LL rt) { if(L <= l && r <= R) { cnt[rt] += v; push_up(l, r, rt); return; } LL m = l + r >> 1; if(L <= m) update(L, R, v, lson); if(R > m) update(L, R, v, rson); push_up(l, r, rt); } int main() { while (~scanf("%d", &n)){ if (n == 0){ putchar('*'); break;} for(LL i = 1; i <= n; ++i) { LL x1, y1, x2, y2; scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2); a[i] = Seg(x1, x2, y1, 1); a[i + n] = Seg(x1, x2, y2, -1); all[i] = x1; all[i + n] = x2; } n <<= 1; sort(a + 1, a + 1 + n); sort(all + 1, all + 1 + n); LL m = unique(all + 1, all + 1 + n) - all - 1; memset(cnt, 0, sizeof cnt); memset(sum, 0, sizeof sum); LL ans = 0; for(LL i = 1; i < n; ++i) { LL l = lower_bound(all + 1, all + 1 + m, a[i].l) - all; LL r = lower_bound(all + 1, all + 1 + m, a[i].r) - all; if(l < r) update(l, r - 1, a[i].d, 1, m, 1); ans += sum[1] * (a[i + 1].h - a[i].h); } printf("%lld\n", ans); } return 0; }
Problem G
推出勾股定理的公式之后直接迭代一波
迭代的时候减掉的那个值忘记*2 WA2小时
=。=
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se second typedef long long LL; typedef double ld; ld r; int k; int l; ld sqr(ld x){ return x * x;} ld calc(ld r, int k){ ld ret; ld now = (sqrt(3.00) - 1.00) * r; rep(i, 1, k){ ret = (now * now) / (2 * now + 2 * r); now -= ret * 2; } return ret; } int main(){ while (~scanf("%d", &l)){ if (l == -1) break; cin >> r; rep(i, 1, l){ cin >> k; double yy = calc(r, k); printf("%d %d\n", k, (int)(yy)); } } return 0; }
Problem L
水DP 树状数组维护
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se second typedef long long LL; const int N = 2e5 + 10; int va[N], w[N], b[N]; int n, x; int c[N], f[N]; inline void update(int x, int val){ for (; x <= n; x += x & -x) c[x] = max(c[x], val); } inline int query(int x){ int ret = 0; for (; x; x -= x & -x) ret = max(ret, c[x]); return ret; } int main(){ while (~scanf("%d", &x)){ ++n; if (x >= 10000) va[n] = x - 10000; else va[n] = x; if (x < 0) w[n] = 0; else if (x >= 10000) w[n] = 5; else w[n] = 1; } rep(i, 1, n) b[i] = va[i]; sort(b + 1, b + n + 1); int cnt = unique(b + 1, b + n + 1) - b - 1; rep(i, 1, n) va[i] = lower_bound(b + 1, b + cnt + 1, va[i]) - b; memset(c, 0, sizeof c); rep(i, 1, n){ f[i] = query(va[i]) + w[i]; update(va[i], f[i]); } int ans = 0; rep(i, 1, n) ans = max(ans, f[i]); printf("%d\n", ans); return 0; }