首页 > 其他分享 >吉司机大杂烩

吉司机大杂烩

时间:2024-03-31 21:47:12浏览次数:18  
标签:maxx ad 标记 mid long 大杂烩 司机 push

CPU监控

历史最大值可以让我们想到吉司机,然后发现这里有个就要考虑区间推平和区间加对lazytag的影响。我们要维护6个tag,maxx,hmaxx,ha,a,hc,c。考虑之前的线段树对于区间覆盖和区间加之怎么做的。我们发现如果我们有一个c标记,那么如果我们要下传一个ad标记,那么我们可以让c加上ad。如果我们要下传一个c标记那我们就覆盖c标记。考虑推广到吉司机上。发现有四种情况(视作一开始就有ad标记,且值为0,所以不会有没ad的情况)

重点代码:

void push_up(long long p){
	d[p].maxx=max(d[p<<1].maxx,d[p<<1|1].maxx);
	d[p].hmaxx=max(d[p<<1].hmaxx,d[p<<1|1].hmaxx);
}
void update(long long ad,long long had,long long c,long long hc,long long p){
	if(d[p].c!=-1e16){
		d[p].hc=max(d[p].hc,d[p].c+had);
		d[p].c+=ad;
	}else{
		d[p].had=max(d[p].had,d[p].ad+had);
		d[p].ad+=ad;
	}
	d[p].hmaxx=max(d[p].hmaxx,d[p].maxx+had);
	d[p].maxx+=ad;
	if(c!=-1e16){
		if(d[p].c!=-1e16){
			d[p].hc=max(d[p].hc,hc);
			d[p].c=c;
		}else{
			d[p].hc=hc;
			d[p].c=c;
		}
		d[p].maxx=c;
		d[p].hmaxx=max(d[p].hmaxx,hc);
	}
}
void push_down(long long p){
	update(d[p].ad,d[p].had,d[p].c,d[p].hc,p<<1);
	update(d[p].ad,d[p].had,d[p].c,d[p].hc,p<<1|1);
	d[p].c=d[p].hc=-1e16;
	d[p].ad=d[p].had=0;
}
void update_ad(long long l,long long r,long long p,long long s,long long t,long long ad){
	if(l>=s&&r<=t){
		if(d[p].c!=-1e16){
			d[p].hc=max(d[p].hc,d[p].c+ad);
			d[p].c+=ad;
		}else{
			d[p].had=max(d[p].had,d[p].ad+ad);
			d[p].ad+=ad;
		}
		d[p].hmaxx=max(d[p].hmaxx,d[p].maxx+ad);
		d[p].maxx+=ad;
		return;
	}
	long long mid=(l+r)>>1;
	push_down(p);
	if(s<=mid) update_ad(l,mid,p<<1,s,t,ad);
	if(t>mid) update_ad(mid+1,r,p<<1|1,s,t,ad);
	push_up(p);
}
void update_c(long long l,long long r,long long p,long long s,long long t,long long c){
	if(l>=s&&r<=t){
		if(d[p].c!=-1e16){
			d[p].hc=max(d[p].hc,c);
			d[p].c=c;
		}else{
			d[p].hc=c;
			d[p].c=c;
		}
		d[p].maxx=c;
		d[p].hmaxx=max(d[p].hmaxx,c);
		return;
	}
	long long mid=(l+r)>>1;
	push_down(p);
	if(s<=mid) update_c(l,mid,p<<1,s,t,c);
	if(t>mid) update_c(mid+1,r,p<<1|1,s,t,c);
	push_up(p);
}

线段树 3
没有2的操作上面讲过了,然后考虑区间推平怎么做。我们可以维护一个maxx,se,mx_ad,ad,cnt然后还有普通的sum,hmx_ad,had,hmaxx然后区间推平时如果这个区间只有一种数大于推平的数,那么就操作,否则就递归下去。因为这个只有ad标记,上面都讲过了

void push_up(long long p){//好理解
	d[p].sum=d[p<<1].sum+d[p<<1|1].sum;
	d[p].maxx=max(d[p<<1].maxx,d[p<<1|1].maxx);
	d[p].hmaxx=max(d[p<<1].hmaxx,d[p<<1|1].hmaxx);
	if(d[p<<1].maxx==d[p<<1|1].maxx){
		d[p].se=max(d[p<<1].se,d[p<<1|1].se);
		d[p].cnt=d[p<<1].cnt+d[p<<1|1].cnt;
	}else if(d[p<<1].maxx>d[p<<1|1].maxx){
		d[p].se=max(d[p<<1|1].maxx,d[p<<1].se);
		d[p].cnt=d[p<<1].cnt;
	}else if(d[p<<1].maxx<d[p<<1|1].maxx){
		d[p].se=max(d[p<<1].maxx,d[p<<1|1].se);
		d[p].cnt=d[p<<1|1].cnt;
	}
}
void update(long long mx_ad,long long mx_had,long long ad,long long had,long long p){//顺序,se的id(好理解)
	d[p].sum+=(ad*(d[p].r-d[p].l+1-d[p].cnt)+mx_ad*d[p].cnt);
	d[p].hmaxx=max(d[p].maxx+mx_had,d[p].hmaxx);
	d[p].maxx+=mx_ad;
	if(d[p].se!=1e16) d[p].se+=ad;
	d[p].mx_had=max(d[p].mx_had,mx_had+d[p].mx_ad);
	d[p].had=max(d[p].had,had+d[p].ad);
	d[p].ad+=ad;
	d[p].mx_ad+=mx_ad;
}
void push_down(long long p){
	int maxx=max(d[p<<1].maxx,d[p<<1|1].maxx);//这里要临时存一下,不然会变
	if(maxx==d[p<<1].maxx) update(d[p].mx_ad,d[p].mx_had,d[p].ad,d[p].had,p<<1);//下传的是对应的la,是maxx传maxx,否则传次大值的
	else update(d[p].ad,d[p].had,d[p].ad,d[p].had,p<<1);
	if(maxx==d[p<<1|1].maxx) update(d[p].mx_ad,d[p].mx_had,d[p].ad,d[p].had,p<<1|1);
	else update(d[p].ad,d[p].had,d[p].ad,d[p].had,p<<1|1);
	d[p].mx_had=d[p].mx_ad=d[p].had=d[p].ad=0;
}
void update_ad(long long l,long long r,long long p,long long s,long long t,long long ad){
	if(l>=s&&r<=t){
		d[p].sum+=ad*(d[p].r-d[p].l+1);
		d[p].hmaxx=max(d[p].maxx+ad,d[p].hmaxx);
		d[p].maxx+=ad;
		if(d[p].se!=1e16) d[p].se+=ad;
		d[p].mx_had=max(d[p].mx_had,d[p].mx_ad+ad);
		d[p].had=max(d[p].had,d[p].ad+ad);
		d[p].ad+=ad;
		d[p].mx_ad+=ad;
		return;
	}
	long long mid=(l+r)>>1;
	push_down(p);
	if(s<=mid) update_ad(l,mid,p<<1,s,t,ad);
	if(t>mid) update_ad(mid+1,r,p<<1|1,s,t,ad);
	push_up(p);
}
void update_min(long long l,long long r,long long p,long long s,long long t,long long ad){
	if(ad>=d[p].maxx) return;
	if(l>=s&&r<=t&&ad>d[p].se){
		d[p].sum-=d[p].cnt*(d[p].maxx-ad);
		d[p].mx_ad-=(d[p].maxx-ad);
		d[p].maxx=ad;
		return;
	}
	long long mid=(l+r)>>1;
	push_down(p);
	if(s<=mid) update_min(l,mid,p<<1,s,t,ad);
	if(t>mid) update_min(mid+1,r,p<<1|1,s,t,ad);
	push_up(p);
}

标签:maxx,ad,标记,mid,long,大杂烩,司机,push
From: https://www.cnblogs.com/wuhupai/p/18088301

相关文章

  • 滴滴驾龄不够没想到注册难题注册滴滴司机驾龄不满3年还有别的办法吗
    如果您想要成为滴滴司机但驾龄不足,以下是一些可能的解决方案:了解滴滴司机的注册要求滴滴对司机的驾龄通常有特定的要求,通常需要三年以上的驾龄。这是为了确保司机具备足够的驾驶技术和经验,以保障乘客的安全。了解这些要求是成功注册的第一步。如果注册不通过,你可以尝试联......
  • 高德司机端趣接单抢单辅助器源码分享下载 -24软件网
    在网约车行业中,司机端抢单是一项关键的操作,直接关系到司机的订单量和收入。有一些开发者或者个体经营者可能尝试通过编写抢单源码辅助器来提高抢单的效率。然而,这样的做法可能会违反平台规定,涉及到技术伦理和法律风险。本文将介绍司机端抢单源码辅助器的技术实现方式,以及可能面临......
  • 老司机批量巧删扫描出来的有害程序--一条指令彻底删除扫描出来的有害程序
    作者:田逸(formyz)一个NFS服务器,为多个Web项目所共享。这些目录包括PHP程序、图片、HTML页面和用户上传的文档和附件等。因为某些Web框架古老,存在诸如不对上传文件做严格的安全性检查,虽然此NFS服务器位于受保护的内部网络,但任然被别有用心的人上传了大量的恶意文件。强烈要求程序员进......
  • 基础数论大杂烩
    exgcd一,前置知识:裴蜀定理:若有\(a,b\)且\(a,b\)不全为0,则存在整数\(x,y\),使得\(ax+by=gcd(a,b)\)。二,算法过程:作用:给定\(a,b,c\),求解\(ax+by=c\)的整数解。我们先考虑求解\(ax+by=gcd(a,b)\)。由于\(gcd(a,b)=gcd(b,a\%b)\),所以有:\(\begin{cases}ax_1+by_1=gcd(a,b)\\bx_......
  • 【学习笔记】Segment Tree Beats/吉司机线段树
    一.区间最值操作本文对吉如一老师在\(2016\)年国家集训队论文中的线段树处理历史区间最值的问题的一些杂谈。区间最值笼统地指求区间的最值以及区间所有数对\(x\)取最值(即令\(a_i=\max/\min(a_i,x)\))这一类的查询与修改操作。HDU5306GorgeousSequence支持对区间......
  • 吉司机线段树
    \(mxb\)为历史最大值,\(tg1,tg2,tg3,tg4\)分别对应最大值真实\(tag\),其他值真实\(tag\),最大值最大\(tag\),其它值最大\(tag\)#include<bits/stdc++.h>usingnamespacestd;#defineN500005#defineintlonglongintn,m;inta[N];structTREE{ intsum[N*4],mxb[N......
  • 信号量解决协调进程同步问题(司机与售票员问题)
    问题描述(在日常生活中司机和售票员的行为动作需要满足一定的规则)分析并发进程的交互点1.首先我们将司机和售票员看成是2个进程,他们需要协调配合完成工作2.我们需要找到进行并发执行过程中的交互点(一个进行肯定要等另一个进程做了才能接着往下做),在这个点上我们需要使用P......
  • 吉司机线段树
    一、区间历史最值以区间历史最大值为例。首先,相应地,设\(maxb\)表示一个节点的区间历史最大值。为了更新一个区间的子区间,再设一个\(tag2\),表示\(tag1\)从上次\(push\_down\)以后到现在达到过的最大值。\(code:\)voidpush_up(intu){p[u].w=p[u<<1].w+p[u<<1|1].w......
  • 和出租车司机的一段对话
    昨天晚上,用打车软件,打到车后,和司机大哥的一段对话,感觉很有意思,可以对做产品提供些实在的指导,所以记录下来,和大家共享。 我:好不容易,等了半天,要不是用滴滴打车还真打不到的司机:是的。新街口这样的地方,要想打到的真不容易的。用滴滴才行。我:滴滴打车好像真的很方便啊?司机:是的,朋友......
  • 生信老司机以中心法则为主线讲解组学技术的应用和生信分析心得—限时免费
    海哥,中国科学院遗传与发育生物学研究所,生物信息学博士。在生信宝典出品过多部“傻瓜式”教程。生信宝典之傻瓜式(一)如何提取指定位置的基因组序列生信宝典之傻瓜式(二)如何快速查找指定基因的调控网络生信宝典之傻瓜式(三)我的基因在哪里发光-如何查找基因在发表研究中......