Description
你意外来到了一个未知的星球, 这里是一个动物乌托邦, 生活着一群拥有非凡智力的动物.
你遇到了一个叫做尼克的狐狸, 他准备给他的 GF 过生日 。
他将制作一个巨大的多层蛋糕, 他已经有了一些圆柱形的单层蛋糕, 可以把这些蛋糕拼
装起来。 遗憾的是, 由于一些限制, 这些单层蛋糕并不能被全部利用, 你只能选出一部分来
制作多层蛋糕:
- 1.物理学要求: 为了稳定和美观, 半径大的蛋糕必须在放在半径小的蛋糕下面。
- 2.Mr.Big 的钦定要求: 编号小的蛋糕必须放在编号大的蛋糕下面。
作为交换, 他将向你介绍黑社会老大 Mr.Big, Mr.Big 会告诉你一些黑科技, 这也许是
击败人工智能的关键。
你需要帮他制定一个使多层蛋糕总体积最大的方案, 并计算出最大蛋糕的总体积。
注意: 两个半径相同的蛋糕不能放在一起。
Input
第一行一个整数 n,
接下来 n 行,第 i+1 行两个整数 R,H 分别表示编号为 i 的蛋糕的半径和高度。
Output
只有一行一个整数, 为最大总体积, 你需要精确到整数位。
Sample Input
5
10 7
12 1
1 4
9 7
1 1
Sample Output
3983.54
二维偏序稞题,首先按读入顺序更新线段树,以蛋糕半径为下标,以当前此半径为低的最优体积为线段树的值。最终答案为线段树中的最大值。
看到一份优秀的代码,写得比某蒟蒻好得多,发出来供大家参考。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 #include <stack> 8 #include <map> 9 #include <vector> 10 #include <queue> 11 #define ls (x << 1) 12 #define rs (x << 1 | 1) 13 #define mid ((l + r) >> 1) 14 #define L 100010 15 #define LL long long 16 const double pi = 3.14159265358979323846; 17 using namespace std; 18 19 inline int gi() { 20 char cj = getchar(); 21 int ans = 0, f = 1; 22 while (cj < ‘0‘ || cj > ‘9‘) { 23 if (cj == ‘-‘) f = -1;cj = getchar(); 24 } 25 while (cj >= ‘0‘ && cj <= ‘9‘) ans = ans * 10 + cj - ‘0‘, cj = getchar(); 26 return f * ans; 27 } 28 29 int n, R, r[L], h[L]; 30 LL v[L], tr[L << 3], ans; 31 32 inline LL query(int x, int l, int r, int a, int b) { 33 if (a <= l && b >= r) return tr[x]; 34 if (b < l || a > r) return 0; 35 if (b <= mid) return query(ls, l, mid, a, b); 36 else if (a > mid) return query(rs, mid + 1, r, a, b); 37 else return max(query(ls, l, mid, a, mid), query(rs, mid + 1, r, mid + 1, b)); 38 } 39 40 inline void update(int x, int l, int r, int a, LL w) { 41 if (l == r) {tr[x] = max(w, tr[x]); return ;} 42 if (a <= mid) update(ls, l, mid, a, w); 43 else if (a > mid) update(rs, mid + 1, r, a, w); 44 tr[x] = max(tr[ls], tr[rs]); 45 } 46 47 int main() { 48 n = gi(); 49 for (int i = 1; i <= n; ++i) r[i] = gi(), h[i] = gi(), R = max(R, r[i]); 50 R++; 51 for (int i = 1; i <= n; ++i) { 52 LL maxx = query(1, 0, R, r[i] + 1, R); 53 v[r[i]] = max(v[r[i]], maxx + h[i] * r[i] * r[i]); 54 update(1, 0, R, r[i], v[r[i]]); 55 } 56 ans = query(1, 0, R, 0, R); 57 printf("%.2lf\n", ans * pi); 58 return 0; 59 }
时间: 2024-10-27 11:36:43