[NOI2007]货币兑换Cash

5分钟搞懂双目相机标定:从棋盘格到3D点云的完整流程(附Python代码) 本文详细介绍了双目相机标定的完整流程,从棋盘格准备到3D点云生成,涵盖单目标定、双目标定、立体校正、视差计算等关键步骤。通过Python代码示例,帮助读者快速掌握双目立体视觉技术,实现高精度的3D重建。特别适合机器人导航、工业检测等应用场景。 阅读详情

/*

写完以后发现有牛人使用STL……在BZOJ(开了O2)上可以AC……

http://hi.baidu.com/wwwaaannngggrs/blog/item/e536b809c5b533d23bc763ca.html

*/


这道题是非常典型的斜率优化,蛋疼之处在于x并不单调,得用Splay维护……


方程是f[i]=max(f[i-1],a[i]*x[j]+b[i]*y[j])(j∈[1,n-1])//x[i],y[i]表示在f[i]取到最优值的情况下在第i天能够获得a券和b券的数量

暴力的O(n^2)算法是比较裸的//我一开始写了个暴力检验正确性……

但是极限数据为10w,O(n^2)过不了……


然后这道题可以斜率优化

把式子改写成

-a[i]*x[j]+f[i]=b[i]*y[j]

-a[i]/b[i]*x[j]+f[i]=y[j]

那么斜率为-a[i]/b[i],求最大截距

相当于维护一个上凸壳

问题在于这个式子的x,也就是x[i]是并不单调的,因为每天能够获得的a券数量不见得单调递增

那么要关于x建一棵Splay

然后每次找对于当前直线的最优值的时候

因为当前当前直线能够碰到的第一个点一定满足这样的性质:

这个点和它左边的点所在的直线斜率大于当前直线

这个点和它右边的点所在直线的斜率小于当前直线

那么Splay里面还维护一个这个点和它左边的点的斜率,和右边的店的斜率

就可以在logn时间里找出最优决策


插入的话可以找到应该插在那个位置,插入以后Splay到根

然后分别维护左边凸壳,右边凸壳 //具体做法在code中

/*

这道题十分诡异……我在本机利用cena和NOI07的官方数据测的时候是AC的,用时2.5s左右,加fastio用时1s以下

但是交到BZOJ和TW的一个OJ上,这两个以linux为平台的OJ会让我TLE掉,可以确定不是常数问题,加了fastio也是如此

也许是windows和linux又有哪里蛋疼了……因为电脑上没linux,就这样吧,以后有时间在linux下再看看

*/


//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
using namespace std;
//Macro
#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
#define rrep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define read() (strtol(ipos,&ipos,10))
#define sqr(x) ((x)*(x))
#define pb push_back
#define PS system("pause");
typedef long long ll;
typedef pair<int,int> pii;
const int oo=~0U>>1;
const double inf=1e20;
const double eps=1e-6;
string name="cash",in=".in",out=".out";
//Var
int n,root;double s;
double a[100008],b[100008],r[100008];
double f[100008];
long long base[20];
char Input[10000008],*ipos;
struct T
{
	int lc,rc,fa;
	double lk,rk,x,y;
	#define lc(t) tree[t].lc
	#define rc(t) tree[t].rc
	#define fa(t) tree[t].fa
	#define x(t) tree[t].x
	#define y(t) tree[t].y
	#define lk(t) tree[t].lk
	#define rk(t) tree[t].rk
}tree[100008];
inline double getreal()
{
	int x=0,z=0;char c;
	long long y=0;
	while (*ipos<=32) ipos++;
	while (1)
	{
		c=*ipos++; if (c<=32) return x;
		if (c<48) break;
		x=(x<<3)+(x<<1)+c-48;
	}
	while (1)
	{
		c=*ipos++; if (c<=32) return x+double(y)/base[z];
		y=(y<<3)+(y<<1)+c-48;
		z++;
	}
}
void Zig(int x)
{
	int y=fa(x),z=fa(y);
	if(lc(z)==y)lc(z)=x;else rc(z)=x;fa(x)=z;
	fa(rc(x))=y;lc(y)=rc(x);fa(y)=x;rc(x)=y;
}
void Zag(int x)
{
	int y=fa(x),z=fa(y);
	if(lc(z)==y)lc(z)=x;else rc(z)=x;fa(x)=z;
	fa(lc(x))=y;rc(y)=lc(x);fa(y)=x;lc(x)=y;	
}
void Splay(int x,int &goal)
{
	int ff=fa(goal);
	for(int y,z;fa(x)!=ff;)
	{
		y=fa(x);z=fa(y);
		if(z==ff)
			if(lc(y)==x)Zig(x);
			else Zag(x);
		else
			if(lc(z)==y)
				if(lc(y)==x)Zig(y),Zig(x);
				else Zag(x),Zig(x);
			else
				if(rc(y)==x)Zag(y),Zag(x);
				else Zig(x),Zag(x);
	}
	goal=x;
}
double CalcY(int i){return f[i]/(r[i]*a[i]+b[i]);}
int Find(double x)
{
	for(int i=root;;)
	{
		if(lk(i)<x)i=lc(i);
		else if(rk(i)>x)i=rc(i);
		else return i;
	}
}
double CalcK(double xx1,double yy1,double xx2,double yy2){return (xx1==xx2)?-oo:(yy1-yy2)/(xx1-xx2);}
int Merge(int x,int y)
{
	int i=x;
	for(;rc(i);i=rc(i));
	rc(i)=y;fa(y)=i;
	return x;
}
void Update()
{
	int t=root;
	if(!lc(t))
	{
		lk(t)=oo;
		rk(t)=lk(rc(t))=CalcK(x(t),y(t),x(rc(t)),y(rc(t)));
	}
	if(!rc(t))
	{
		rk(t)=-oo;
		lk(t)=rk(lc(t))=CalcK(x(t),y(t),x(lc(t)),y(lc(t)));
	}
	if(lc(t)&&rc(t))
	{
		lk(t)=rk(lc(t))=CalcK(x(t),y(t),x(lc(t)),y(lc(t)));
		rk(t)=lk(rc(t))=CalcK(x(t),y(t),x(rc(t)),y(rc(t)));
		if(lk(t)<=rk(t))
		{
			root=Merge(lc(t),rc(t));fa(root)=0;
			rk(root)=lk(rc(root))=CalcK(x(root),y(root),x(rc(root)),y(rc(root)));

		}
	}
}
int FixL()
{
	int s;
	for(int i=lc(root);i;)
	{
		if(CalcK(x(i),y(i),x(root),y(root))<lk(i))s=i,i=rc(i);
		else i=lc(i);
	}
	return s;
}
int FixR()
{
	int s;
	for(int i=rc(root);i;)
	{
		if(CalcK(x(i),y(i),x(root),y(root))>rk(i))s=i,i=lc(i);
		else i=rc(i);
	}
	return s;
}
void Insert(int t)
{
	y(t)=CalcY(t);x(t)=y(t)*r[t];int flag,i;
	for(i=root;i;)
	{
		if(x(i)>x(t)){flag=i;i=lc(i);}
		else if(x(i)<x(t)){flag=i;i=rc(i);}
		else if(y(i)>=y(t))return;
		else{y(i)=y(t),t=i;break;}
	}
	if(!i)if((x(flag)<x(t)))rc(flag)=t;else lc(flag)=t;
	if(!i)fa(t)=flag;
	Splay(t,root);
	if(lc(t))
	{
		flag=FixL();
		Splay(flag,lc(root));
		rc(flag)=0;
	}
	if(rc(t))
	{
		flag=FixR();
		Splay(flag,rc(root));
		lc(flag)=0;
	}
	Update();
}
void Init()
{
	base[0]=1;
	rep(i,1,18)base[i]=base[i-1]*10;
	fread(ipos=Input,10000000,1,stdin);
	n=read();s=getreal();
	scanf("%d%lf",&n,&s);
	rep(i,1,n){a[i]=getreal();b[i]=getreal();r[i]=getreal();}
}
void Work()
{
	f[1]=s;y(1)=CalcY(1);x(1)=y(1)*r[1];root=1;lk(1)=oo;rk(1)=-oo;
	rep(i,2,n)
	{
		int j=Find(-a[i]/b[i]);
		f[i]=max(f[i-1],x(j)*a[i]+y(j)*b[i]);
		Insert(i);
	}
	printf("%.3lf\n",f[n]);
}
int main()
{
//	freopen((name+in).c_str(),"r",stdin);
//	freopen((name+out).c_str(),"w",stdout);
	Init();
	Work();
	return 0;
}


分立器件---电感介绍(7000字) 电感基础整理 阅读详情

相关推荐

图像超分辨率在医学影像中的应用:如何用深度学习提升CT/MRI图像质量

本文探讨了深度学习驱动的图像超分辨率技术在医学影像(如CT/MRI)质量提升中的应用。文章分析了医学图像超分辨率在提升诊断信息含量、平衡保真度与临床相关性方面的独特挑战,并详细介绍了如何针对3D体数据特点定制模型架构、设计病理感知损失函数,以及解决高质量配对数据稀缺的策略。通过实战案例,阐述了从数据模拟、模型训练到临床评估的完整流程,旨在为医学影像的清晰化与诊断精准化提供有效解决方案。

weixin_29063681的博客 523

bzoj1492: [NOI2007]货币兑换Cash

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define maxn 100005 7 #define Inf 1000000000 ...

weixin_30566111的博客 129

永磁同步电机解耦控制实战:从电流反馈到内模解耦的算法演进与选型指南

本文深入探讨了永磁同步电机高性能驱动中的核心挑战——交叉耦合问题,并对比分析了电流反馈解耦和内模解耦两大主流算法的原理、性能与适用场景。文章指出,电流反馈解耦动态响应快但对参数敏感,内模解耦鲁棒性更强但略有滞后,为工程师在不同应用需求下的算法选型提供了清晰的实战指南。

weixin_29039773的博客 265

【BZOJ1492】【NOI2007】货币兑换 Cash(CDQ分治,斜率优化)

Description 搓我 Solution 容易列出方程: t=max(dpjai+dpj/rtj×bi)t=max(dpjai+dpj/rtj×bi)t=max(dp_ja_i+dp_j/rt_j\times b_i) dpi=t×rti/(ai×rti+bi)dpi=t×rti/(ai×rti+bi)dp_i=t\times rt_i/(a_i\times rt_i+b_i)...

დ♂Hany01's Blog Space♂ღ 350

避开命令行!在VMware vCenter 8.0图形化界面里搞定SSL证书续期全流程

本文详细介绍了在VMware vCenter 8.0图形化界面中完成SSL证书续期的全流程,包括计算机SSL证书、VMCA根证书和STS证书的管理。通过可视化操作,管理员无需使用命令行即可高效处理证书问题,确保vSphere环境的稳定运行。文章还提供了证书监控与预警配置的实用技巧,帮助用户提前规避证书过期风险。

weixin_27051161的博客 284

Mac新手必看:为什么你的终端找不到Python命令?5分钟搞定zsh报错

本文针对Mac用户在终端遇到“zsh: command not found: python”报错的问题,提供了深度解析与实战修复指南。文章解释了macOS系统因历史原因默认使用`python3`而非`python`命令,并详细介绍了四种解决方案:养成使用`python3`的习惯、创建别名、通过Homebrew安装链接以及修改PATH环境变量,帮助新手快速解决zsh报错,顺利开始Python开发。

weixin_29248653的博客 594

1492: [NOI2007]货币兑换Cash

Description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券)。每个持有金券的顾客都有一个自己的帐户。金券的数目可以是一个实数。每天随着市场的起伏波动, 两种金券都有自己当时的价值,即每一单位金券当天可以兑换的人民币数目。我们记录第 K 天中 A券 和 B券 的 价值分别为 AK 和 BK(元/单位金券)。为...

weixin_30699443的博客 213

STM32H743VIT6最小系统板PCB设计全流程(AD09实战教程+封装库分享)

本文详细介绍了基于STM32H743VIT6高性能MCU的最小系统板PCB设计全流程。内容涵盖从项目规划、原理图设计到PCB布局布线的AD09实战操作,重点解析了高速电路设计中的电源、时钟、去耦等关键模块的处理要点与常见陷阱,并分享了经过验证的封装库资源,旨在为工程师提供一套完整、可靠的设计方法与实战参考。

weixin_29194693的博客 119

NOI 2007 货币兑换Cash (cdq分治 or Splay)

在cdq分治之前,先用n^2的算法理一理题意。 Description Input 第一行两个正整数N、S,分别表示小Y 能预知的天数以及初始时拥有的钱数。 接下来N 行,第K 行三个实数AK、BK、RateK,意义如题目中所述 Output 只有一个实数MaxProfit,表示第N 天的操作结束时能够获得的最大的金钱 数目。答案保留3 位小数。 S

可视化和机器学习 967

从SSD到UFS:3分钟搞懂存储技术进化史(含最新协议对比)

本文梳理了从SSD到UFS的存储技术演进历程,重点解析了eMMC与UFS在架构上的核心差异。UFS凭借高速串行全双工接口,实现了性能与能效的飞跃。文章还对比了最新的UFS 4.0与PCIe 5.0 SSD协议,并探讨了3D NAND、SLC缓存等底层技术,揭示了移动与PC存储技术融合的未来趋势。

weixin_29294597的博客 279

经典EMC案例-汽车车载电子行车记录仪显示屏EMC BCI整改案例

拿到这款汽车前装车载电子行车记录仪,小编首先在实验室还原客户描述的现象,确定现象符合客户的描述,再根据现象出现的对应频率做好记录,因为通常BCI FAIL的现象不局现于一个频率点,然后通过这些现象及频点,再结合产品的构造、线束,分析构思出大致解决方案。

jack_luo4913的博客 3738

【BZOJ 1492】 [NOI2007]货币兑换Cash

斜率优化dp+CDQ分治~

Regina8023 1421

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

[BZOJ1492][NOI2007]货币兑换Cash

动态规划优化 斜率优化 splay

srand(time(0)) 617

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

bzoj 1492: [NOI2007]货币兑换Cash

1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 4160  Solved: 1734 [Submit][Status][Discuss] Description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券)。每个持有金

lethalboy 469

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

bzoj1492 [NOI2007]货币兑换Cash(斜率优化DP+cdq分治)

bzoj1492 [NOI2007]货币兑换Cash 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1492 题意: 金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券)。每个持有金券的顾客都有一个自己的帐户。金券的数目可以是一个实数。每天随着市场的起伏波动,两种金券都有自己当时的价值,即每一单位金券当

Bfk的博客 597

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)

[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币;每次卖出操作卖出所有的金券. 设dp[i]表示第i天卖出所有金券的能够得到的钱数。则有: \[dp[i]=max(dp[i-1],\frac{dp[j]}{A[j] \times R[j]+B[j] } \t...

weixin_30551963的博客 187

BZOJ 1492 [NOI2007]货币兑换Cash(斜率优化dp+splay维护凸壳)

中文题,我就不复述题意了……         首先,由于这个买入和卖出并没有中间商赚取差价(吐槽一下),所以说每一天结束之后的价值既可以用钱来表示也可以用金券来表示。那么这样的话,我们用f[i]表示第i天的时候最多能够得到的钱,x[j]表示第j天的时候把钱换为最多的A的数量,y[j]表示对应的b的数量。那么有转移方程f[i]=max(f[i-1],x[j]*A[i]+y[j]*B[i]),直接枚举复杂度为O(N^2)。显然对于最大可达10^5的数据来说是不够的。         于是我们很容易去想到斜率优化

alpc_qleonardo 728

bzoj 1492: [NOI2007]货币兑换Cash (dp+cdq分治)

1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 3801  Solved: 1602 [Submit][Status][Discuss] Description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券)。每个持有金

clover_hxy的博客 1363

BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】

1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 5391  Solved: 2181 [Submit][Status][Discuss] Description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券)。每个持有金

Mychael的无声乐章 323

【NOI2007】【BZOJ1492】货币兑换Cash

BZOJ题面是图片来的. 文字版题面 1797 货币兑换2007年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master题目描述 Description小 Y 最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A 纪 念券(以下简称 A 券)和 B 纪念券(以下简称 B 券)。每个持有金券的顾客都有 一个自己的帐户。金券的数目可以

CreationAugust is 14 years old forever 1494

【bzoj 1492】【codevs 1797】 [NOI2007]货币兑换Cash (dp+cdq分治)

萧疏飒沓,清水幽扬

reverie_mjp的博客 566

bzoj1492 [NOI2007]货币兑换Cash

1492: [NOI2007]货币兑换Cash Time Limit:5 SecMemory Limit:64 MBSubmit:5840Solved:2346[Submit][Status][Discuss] Description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券)。每个...

weixin_30237281的博客 117

bzoj1492【NOI2007】货币兑换Cash

斜率优化DP+CDQ分治

AaronPolaris 4786

【CDQ分治】NOI2007货币兑换Cash

分析: 非常经典的CDQ版题。。。不知道为什么之前没写博客。。现在补上。 首先,不难得到一个会T的DP,定义DP[i]DP[i]DP[i]表示前i天能得到的最大钱数。 DP[i]=max{DP[j]∗Ai+DP[j]/ratej∗Bi}DP[i]=max{DP[j]∗Ai+DP[j]/ratej∗Bi}DP[i]=max\{DP[j]*A_i+DP[j]/rate_j*B_i\} 即表示在...

氧化钠的博客 399
上一篇: 关于斜率优化的DP
下一篇: SGU117
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值