[bzoj1010]:[HNOI2008]玩具装箱toy

2024-02-05 15:08

本文主要是介绍[bzoj1010]:[HNOI2008]玩具装箱toy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门
HNOI2008 All Clear!
这个题貌似有三种做法。。
首先可以斜率优化dp
然后可以证(da)明(biao)发现决策单调性
之后根据这个结论有两个做法:
1.每次算出来一个dp[i],就往后二分查找影响区间的变化点x,然后将[x,n]涂上i
然后按照这样递推算出来就好了,涂色用线段树, O(nlog2n)
2.用单调队列和二分查找,具体可以看hzwer的code
参(chao)考(xi)资料:http://hzwer.com/2114.html
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
inline int read(){int x=0;char ch=' ';int f=1;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')f=-1,ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
const int N=5e4+5;
int n;
ll L,c[N],dp[N],sum[N];
struct data{int l,r,p;}q[N];
inline ll sq(ll x){return x*x;}
inline ll calc(int j,int i){return dp[j]+sq(sum[i]-sum[j]+i-j-1-L);}
inline int find(data t,int q){int l=t.l,r=t.r,mid;while(l<=r){mid=(l+r)>>1;if(calc(q,mid)<calc(t.p,mid))r=mid-1;else l=mid+1;}return l;
}
inline void DP(){int l=1,r=1;q[1]=(data){0,n,0};for(int i=1;i<=n;i++){if(i>q[l].r)l++;dp[i]=calc(q[l].p,i);if(l>r||calc(i,n)<calc(q[r].p,n)){while(l<=r&&calc(i,q[r].l)<calc(q[r].p,q[r].l))r--;if(l<=r){int t=find(q[r],i);q[r].r=t-1;q[++r]=(data){t,n,i};}else q[++r]=(data){i,n,i};}}
}
int main(){n=read();L=read();for(int i=1;i<=n;i++)c[i]=read();for(int i=1;i<=n;i++)sum[i]=sum[i-1]+c[i];DP();printf("%lld",dp[n]);return 0;
}

这篇关于[bzoj1010]:[HNOI2008]玩具装箱toy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【C#】装箱拆箱操作

1. 装箱 int num = 10;object obj = num; //装箱操作,将整数转换为对象 2. 拆箱 object obj = 10; //装箱操作,将整数转换为对象int num = (int)obj; //拆箱操作,将对象转换为整数 3. 本质 栈数据和堆数据的相互转移引用数据和值数据的相互转换

请解释Java中的装箱拆箱操作对性能的影响,并讨论其最佳实践。什么是Java中的值传递和引用传递?它们在函数调用中的表现有何不同?

请解释Java中的装箱拆箱操作对性能的影响,并讨论其最佳实践。 在Java中,装箱(Boxing)和拆箱(Unboxing)操作是Java自动类型转换机制的一部分,主要用于基本数据类型(如int, double, char等)和它们对应的包装类(如Integer, Double, Character等)之间的转换。这种机制使得基本数据类型可以像对象一样被操作,但同时也带来了性能上的开销。 装箱

Integer的自动装箱过程

先来看道题  int  a=100;  int  b=100;  Integer  c=a;  Integer  d=b;  System.out.println(a==b);  System.out.println(c==d); 其实这道题  和  a 与  b 没有什么关系,可以直接看成   Integer c=100;   Integer d=100; System.out.

java篇 常用工具类 0x05:基本类型的自动装箱拆箱

文章目录 数字基本类型的封装类和常用方法字符基本类型的封装类和常用方法布尔基本类型的封装类和常用方法 java 从第一个版本开始,就为每种基本类型提供了封装的类,以便可以将其当作类而非基本数据类型使用。 比如 List、Map 这些类,都是操作 Object,无法操作基本数据类型。你无法用 int 作为 Map 的 key 或 value,所以 java 允许让 int 封装

Java自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型占用空间(Byte)表示范围包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Shor

CodeForces - 545A Toy Cars (模拟)

【题目链接】:click here~~ 【题目大意】: 给一个n*n的矩阵,-1只在对角线出现(因为自己不能撞自己),0代表没有车在碰撞,1代表第i辆车(横坐标)被撞坏了,2代表第j辆车(纵坐标)被撞坏了,3代表两辆车都撞坏了。问哪几辆车完好无损。  代码: /* * Problem: CodeForces - 545A * Running time: 15MS *

44-java自动拆箱和自动装箱

java自动拆箱和自动装箱 自动装箱是Java中的一个概念,它允许将一个基本类型直接赋值给对应的包装类。例如,将一个int值赋给Integer对象。 自动拆箱是将包装类对象直接赋值给基本类型变量。例如,将一个Integer对象赋给一个int值。 以下是Java自动装箱和拆箱的示例代码: public class AutoBoxingUnboxing {public static voi

Java学习笔记 --- 自动装箱与自动拆箱

什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。  一般我们要创建一个类的对象实例的时候,我们会这样:  Class a = new Class(parameter);  当我们创建一个Integer对象时,却可以这样:  Integer i = 100; (注意:不是 int i = 100;

【启明智显分享】启明智显低成本AI大模型解决方案革新传统玩具行业

孩童是AI的最佳用户,他们更容易接受新的交互方式,有着强烈的情感陪伴需求,且对AI的心理防线较低。AI儿童陪伴,有望成为AI应用的下一个新共识。根据imarcgroup数据显示,2023年全球玩具市场规模达到1830亿美元,且还在不断增长。在这样一个和AI高度匹配且庞大的市场中,至今仍然没有太多AI产品落地,这也给儿童陪伴硬件市场带来了新的机遇。 启明智显,一家专注于物联网彩屏领域的中国企业,积

java中自动装箱的变态小题目

Integer i1 = 100; Integer i2 =100; boolean b1 = i1== i2;//结果为true   Integer i3 =200; Integer i4 =200; boolean b2 = i3 == i4;//结果为false 完整代码:(编译器二次加工) package cn.jdk.integer;public class Inte