首页 > 其他分享 >CF1534G A New Beginning

CF1534G A New Beginning

时间:2024-06-10 10:37:04浏览次数:20  
标签:int CF1534G 左侧 New Beginning 800010

My Blogs

CF1534G A New Beginning

不太懂为啥是黑。需要先会基本的 slope trick

首先切比雪夫距离可以转成曼哈顿距离但是没啥必要。因为只能向右上走,所以考虑把每个关键点归到它属于的斜率为 \(-1\) 的直线上,即按照 \(x_i+y_i\) 排序分类。

容易发现一定是走到了某条灰线上之后再收取该灰线上的所有点。所以设 \(f_{i,j}\) 表示走到了第 \(i\) 条线,当前横坐标为 \(j\) 的最小代价。

然后感觉一下,固定了 \(i\) 这个东西关于 \(j\) 很像是凸的。实际上可以证明这个东西是凸的。考虑归纳,首先从上一条线到这一条线的转移形态:

点 \(x\) 能从上一条线蓝色的部分转移而来,那对应到函数图像上:

可以发现是把斜率大于 \(0\) 的部分像右移动了一段长度。然后对于这条线上的所有关键点,其对于 \(f\) 的贡献是一个绝对值函数(\(|j-x_i|\))。然后凸函数加凸函数还是凸的,所以归纳成立。

维护这个东西的话,就是开一个对顶堆,维护最低段左侧和右侧的所有拐点。加入一个绝对值函数的时候,根据其和最低的一段的关系分类讨论一下即可(这时可能会出现左侧堆的点跑到右侧堆里去或者相反)。

最后计算答案的时候,由题意得 \(f(0)=\sum x_i\),然后可以根据这个和左侧堆内的信息来推出最低点的纵坐标(实际上就是减去左侧堆的所有点的横坐标)。总复杂度 \(\mathcal O(n\log n)\)。

int n,len,tg,numa[800010];
pii a[800010];
vector<int> ve[800010];
priority_queue<int> q1;
priority_queue<int,vector<int>,greater<int>> q2;
inline void mian()
{
	read(n),q1.e(0),q2.e(0);int s=0;
	for(int i=1;i<=n;++i)read(a[i].fi,a[i].se),numa[++len]=a[i].se+a[i].fi,s+=a[i].fi;
	sort(numa+1,numa+1+len),len=unique(numa+1,numa+1+len)-numa-1;
	for(int i=1;i<=n;++i)ve[lower_bound(numa+1,numa+1+len,a[i].se+a[i].fi)-numa].eb(a[i].fi);
	for(int i=1;i<=len;++i)
	{
		tg+=numa[i]-numa[i-1];
		for(auto p:ve[i])
		{
			if(q1.top()<=p&&p<=tg+q2.top())q1.e(p),q2.e(p-tg);
			else if(p<q1.top())q2.e(q1.top()-tg),q1.pop(),q1.e(p),q1.e(p);
			else q1.e(q2.top()+tg),q2.pop(),q2.e(p-tg),q2.e(p-tg);
		}
	}
	while(q1.size())s-=q1.top(),q1.pop();
	write(s);
}

标签:int,CF1534G,左侧,New,Beginning,800010
From: https://www.cnblogs.com/WrongAnswer90/p/18240435

相关文章

  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第1题new,delete的指向深度拷
    C++PrimerPlus第12章类和动态内存分配12.10编程练习第1题`提示:练习一定要动手操作涉及标准函数及关键词1,new[],delete[],strlen(),strcpy_s(),cout,endl,explicit例如:1,对于下面的类的声明:`提示:设计数组和字符串的new,delete文章目录C++PrimerPlus第12章类......
  • TiDB Distributed NewSQL Database
    TiDB的全称是TiDBDistributedNewSQLDatabase,即TiDB分布式NewSQL数据库。它是一个开源的分布式关系型数据库,结合了传统关系型数据库(RDBMS)的ACID事务特性以及NoSQL数据库的分布式水平扩展能力。通过TiDB,用户可以像使用MySQL一样执行SQL查询,而TiDB的分布式架构则......
  • 翻译《The Old New Thing》- On 64-bit Windows, 32-bit programs run in an emulatio
    On64-bitWindows,32-bitprogramsruninanemulationlayer,andifyoudon'tlikethat,thendon'tusetheemulator-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081222-00/?p=19763RaymondChen 2008年12月22日  ......
  • 翻译《The Old New Thing》- Why isn’t there a SendThreadMessage function?
    Whyisn'tthereaSendThreadMessagefunction?-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p=19743RaymondChen 2008年12月23日为什么没有SendThreadMessage函数?简要文章讨论了Windows中不存在`SendThread......
  • 维护一个对象只能通过new来创建,且要实现对象能够自动销毁的单例代码实现及扩展。
    结论:析构函数设为私有且在单例类的内部维护一个Chelper类。(如果是单例,还要将构造函数设为私有,如果是可以在全局有多个实例但是希望只能提供new创建,则构造必须公有且必须提供成员函数来调用deletethis来调用该对象的析构函数)。具体细节可看代码解释部分。代码实现:test.hcla......
  • 一个全新newsxlr应用商店,极简就好
    前言写在前面,终于手机内存不再告罄了!一、什么是newsxlr应用商店?一个全新的应用商店——newsxlr快应用横空问世了!使用方便,不占内存,点开直接使用web手机页面,即可实现全部功能,不用再安装app。二、如何使用?1.即开即用使用任何一款浏览器(推荐使用newsxlr浏览器),输入网址htt......
  • free() on result of placement new?
    我试图了解在由malloc()分配的缓冲区中,对placementnew的结果调用free()是否有效。请考虑以下几点。这段代码是否表现出任何未定义的行为?(假设T没有重载任何new或delete操作符)T......
  • C++Primer Plus第12章类和动态内存分配--再谈定位new运算符----12.8
    12.5.3再谈定位new运算符本书前面介绍过,定位new运算符让您能够在分配内存时能够指定内存位置。第9章从内置类型的角度讨论了定位new运算符,将这种运算符用于对象时情况有些不同,程序清单12.8使用了定位new运算符和常规new运算符给对象分配内存,其中定义的类的构造函数......
  • C++Primer Plus第12章类和动态内存分配--再谈定位new运算符----12.9
    该程序使用定位new运算符在相邻的内存单元中创建两个对象,并调用了合适的析构函数。#pragmaregion12.9placenew2.cpp//placenew2.cpp--newplacementnew,nodelete#if1#include<iostream>#include<string>#include<new>usingnamespacestd;constintBU......
  • new/类/null/+/PrimitiveValue/valueOf/toString/环境/HTML 脚本元素属性
    newfunctionmyObjCreate(proto){functionF(){}F.prototype=protoreturnnewF();}functionmyNew(F,...args){letobj=myObjCreate(F.prototype)letres=F.call(obj,...args);returntypeofres==='object'&&res!==null?res:obj......