CF629D Babaei and Birthday Cake

2024-09-09 07:32
文章标签 birthday cake cf629d babaei

本文主要是介绍CF629D Babaei and Birthday Cake,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


题意:给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和。

dp[i]=max(dp[j])+v[i](j<i&&v[i]>v[j]);

离散化,线段树维护区间最大值


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;public class Main {public static void main(String[] args) {new CF_629D().run();}
}class CF_629D {void run() {Scanner cin = new Scanner(new BufferedInputStream(System.in));PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));int n = cin.nextInt();for (int i = 0; i < n; i++) {long r = cin.nextLong();volume[i] = r * r * cin.nextLong();}Hash h = new Hash(n, volume);int limit = h.length() - 1;buildtree(1, 0, limit);for (int i = 0; i < n; i++) {int idx = h.Idx(volume[i]);long premax = ask(0, idx - 1, 1, 0, limit);update(idx, premax + volume[i], 1, 0, limit);}cout.printf("%.9f\n", Math.PI * ask(0, limit, 1, 0, limit));cout.flush();}void buildtree(int t, int l, int r) {left[t] = l;right[t] = r;max[t] = 0;if (l == r)return;int mid = (l + r) >> 1;buildtree(t << 1, l, mid);buildtree(t << 1 | 1, mid + 1, r);up(t);}void update(int i, long c, int t, int l, int r) {if (l == r) {max[t] = c;return;}int mid = (l + r) >> 1;if (i <= mid)update(i, c, t << 1, l, mid);elseupdate(i, c, t << 1 | 1, mid + 1, r);up(t);}long ask(int al, int ar, int t, int l, int r) {if (al > ar)return 0L;if (al <= l && r <= ar)return max[t];int mid = (l + r) >> 1;long ans = 0L;if (al <= mid)ans = Math.max(ans, ask(al, ar, t << 1, l, mid));if (ar > mid)ans = Math.max(ans, ask(al, ar, t << 1 | 1, mid + 1, r));return ans;}void up(int t) {max[t] = Math.max(max[t << 1], max[t << 1 | 1]);}final int N = 100_002;long[] volume = new long[N];int[] left = new int[N << 2];int[] right = new int[N << 2];long[] max = new long[N << 2];
}class Hash {Hash(int length, long[] array) {Set<Long> st = new TreeSet<Long>();for (int i = 0; i < length; i++)st.add(array[i]);this.array = new long[st.size()];size = 0;for (long i : st)this.array[size++] = i;}int Idx(long key) {return Arrays.binarySearch(array, 0, size, key);}int length() {return size;}int size;long[] array;
}





这篇关于CF629D Babaei and Birthday Cake的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150540

相关文章

Codeforces Round #327 (Div. 1) E. Birthday【AC自动机+网络流】

先用AC自动机处理子串的问题 建立AC自动机,在上面标记出这个位置含有的串( num[v] num[v])以及维护fail指针含有的串( last[v] last[v])。 这是简单的处理,和沈阳站的B题简直异曲同工。 然后形成了一个DAG图,再用floyd算法将维护出整个DAG图。 用网络流Dinic处理最大独立集的问题,胡伯涛的论文有提及二分图的最大独立集做法。将DAG拆点转化为二分图

ZOJ 3904 Birthday Gift【NTT】

首先,我们知道的是, num1+num2=N num_1+num_2=N,其中 num1 num_1是Alice的盒子数, num2 num_2是Bob的盒子数。 那么 ans[N]=∑Alice(num1)×Bob(N−num1) ans[N]=\sum Alice(num_1)\times Bob(N-num1),明显是FFT的卷积形式。 接下来分析 Alice(num1) Alice(n

经典题hdu 1722 Cake

Cake Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2648 Accepted Submission(s): 1275  Problem Description 一次生日Party可能有p人或者q人参加,现准备有一个大蛋糕.问最少要

【递归+二叉树思想+搜索】 Alice and the Cake题解

Alice and the Cake题解 AC记录:记录-洛谷 题面翻译(大概就是题目大意) 执行恰好 n − 1 n-1 n−1 次操作,每次操作可以选择当前所有蛋糕中满足其重量 w ⩾ 2 w\geqslant 2 w⩾2 的一块,然后将其分为质量分别为 ⌊ w 2 ⌋ \lfloor\dfrac w2\rfloor ⌊2w​⌋ 和 ⌈ w 2 ⌉ \lceil\dfrac

hdu-2134-Cuts the cake

#include<stdio.h> #include<math.h> #define m 3.14 int main() {  int n;  double x,y=0;  while(scanf("%d",&n)&&n!=0)  {   x=sqrt(m*n*n/(3*m));   y=sqrt(2*m*x*x/m);   printf("%.3lf

POJ - 1020 Anniversary Cake

题意:有一块边长为BoxSize的正方形的大蛋糕,现在给出n块不同尺寸的正方形的小蛋糕的边长,问是否能把大蛋糕按恰好切割为这n块小蛋糕,要求每块小蛋糕必须为整块。 思路:有技巧性的DFS,这里有一篇写的很好的:点击打开链接 #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using

【HDU 5448】Marisa’s Cake

题意:给你一个包含n个点的凸包,所有可能出现凸包的面积和。 分析:首先比较暴力的方法就是n^2枚举一条边,求它对答案的贡献。但是点的个数有10^5,因此我们考虑从某一个点出发的所有有向面积。 若我们当前考虑的是第i个点,那么它与第i+1个点形成的这条边所能产生的凸包个数为(2^(n - 2) - 1)个,与第i + 2个点形成的这条边的个数为(2 ^ (n - 3) - 1)个……又因为叉积满

hdu 4454 Stealing a Cake(三分)

题目链接:hdu 4454 Stealing a Cake 题目大意:给定一个起始点s,一个圆形,一个矩形。现在从起点开始,移动到圆形再移动到矩形,求最短距离。 解题思路:在圆周上三分即可。即对角度[0,2*pi]三分,计算点和矩形的距离可以选点和矩形四条边的距离最短值。 #include <cstdio>#include <cstring>#include <cmath>#in

hdu 5448 Marisa’s Cake(几何+凸包)

题目链接:hdu 5448 Marisa’s Cake 解题思路 这题和zoj 3871 Convex Hull有点像,不过点数比较大,不能接受 o(n2) o(n^2)的算法。但是题目给定的是一个凸包,所以可以通过化简,在 o(n) o(n)的复杂度内计算出答案。 首先,对于一个三角形ABC SABC=fA×fB+fB×fC+fC×fA(fi表示点i和原点组成的向量) S_{

zoj 3905 Cake(状压dp)

题目链接:zoj 3905 Cake 代码 #include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 805;struct State {int a, b;State (int a = 0, int b = 0): a(a), b(b) {}bool operat