首页 > 其他分享 >[HEOI2013] Segment李超线段树

[HEOI2013] Segment李超线段树

时间:2023-08-02 10:11:54浏览次数:43  
标签:xj cnt xi int 李超 li HEOI2013 calc Segment

RT
感觉会模板就差不多了,可用作处理一些线段或直线的问题,转化过来的也可以。比如DP的斜率优化,直线的话只用一个log,线段要两个log。
[HEOI2013] Segment

  • 模板
#include<iostream>
using namespace std;
const int mod1=39989;
const int mod2=1e9;
const double esp=1e-9;
const int N=1e5;
typedef pair<double,int> pi;
int n,s[N<<2],cnt;
struct line{
	double k,b;
}li[N];
int cmp(double x,double y){
	if(x-y>esp)	return 1;
	if(y-x>esp)	return -1;
	return 0;	
}
double calc(int id,int d){
	return li[id].k*d+li[id].b;
}
void add(int xi,int yi,int xj,int yj){
	cnt++;
	if(xi==xj)
		li[cnt].b=max(yi,yj),li[cnt].k=0;
	else
		li[cnt].k=1.0*(yj-yi)/(xj-xi),li[cnt].b=yi-li[cnt].k*xi;
}
void upd(int p,int cl,int cr,int u){
	int &v=s[p],mid=cl+cr>>1;
	if(cmp(calc(u,mid),calc(v,mid))==1)	swap(u,v);
	int l=cmp(calc(u,cl),calc(v,cl)),r=cmp(calc(u,cr),calc(v,cr));
	if(l==1||(!l&&u<v))	upd(p<<1,cl,mid,u);
	if(r==1||(!r&&u<v))	upd(p<<1|1,mid+1,cr,u);
}
void update(int l,int r,int u,int p=1,int cl=1,int cr=mod1){
	if(l<=cl&&cr<=r){
		upd(p,cl,cr,u);
		return;
	}
	int mid=cl+cr>>1;
	if(l<=mid)	update(l,r,u,p<<1,cl,mid);
	if(mid<r)	update(l,r,u,p<<1|1,mid+1,cr);
}
pi pmax(pi x,pi y){
	if(cmp(x.first,y.first)==1)	return x;
	if(cmp(x.first,y.first)==-1)	return y;
	return x.second<y.second?x:y;
}
pi query(int d,int p=1,int cl=1,int cr=mod1){
	if(cl>d||cr<d)	return {0,0};
	double res=calc(s[p],d),mid=cl+cr>>1;
	if(cl==cr)	return {res,s[p]};
	return pmax({res,s[p]},pmax(query(d,p<<1,cl,mid),query(d,p<<1|1,mid+1,cr)));
}
int main(){
	int xi,xj,yi,yj,d,op,laas=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d%d",&xi,&yi,&xj,&yj);
			xi=(xi+laas-1+mod1)%mod1+1; 
			xj=(xj+laas-1+mod1)%mod1+1; 
			yi=(yi+laas-1+mod2)%mod2+1; 
			yj=(yj+laas-1+mod2)%mod2+1;
			if(xi>xj)	swap(xi,xj),swap(yi,yj);
			add(xi,yi,xj,yj);
			update(xi,xj,cnt);
		}
		else{
			scanf("%d",&d);
			d=(d+laas-1+mod1)%mod1+1;
			laas=query(d).second;
			printf("%d\n",laas);
		}
	}
} 

标签:xj,cnt,xi,int,李超,li,HEOI2013,calc,Segment
From: https://www.cnblogs.com/whz-lld/p/17599844.html

相关文章

  • luogu P4069 [SDOI2016] 游戏 题解【李超树+树剖】
    目录题目描述解题思路code题目描述P4069[SDOI2016]游戏一棵树,树上有\(n\)个节点,最初每个节点上有\(1\)个数字:\(123456789123456789\)。有两种操作:\(\centerdot\)选择\(s,t\)两个节点,将路径上的每一个点都变多(\(1\)个变\(2\)个)数字:\(a\timesdis+b\),其中\(dis\)表示该节点......
  • CF997E Good Subsegments
    简单题,不知道为啥和弱化版一个Difficulty。考虑弱化怎么做。区间\([l,r]\)中的数是连续的,当且仅当区间最大值\(\max\)减去区间最小值\(\min\)为\(r-l\),即\(\max-\min=r-l\)。考虑扫描线,固定右端点\(r\),统计每个左端点的贡献。由于\(S(l,r)=\text{max}-\text{min}+l......
  • StarRocks Segment源码阅读笔记--Page的组成
    Page由4部分组成PageBody,PageFooter,FooterSize(4),CheckSum(4)PageBody是由page类型决定的,可能是压缩的。PageFooter是经过序列化的PageFooterPB。它包含page_type、未压缩的body大小和其他通用的元数据。如果PageBody的大小和未压缩的body大小一致,则表示这个page是未压缩的。F......
  • SAM(segment-anything导出onnx模型报错unsupported onnx opset version:17)
    问题导出samonnx模型时,报错!版本:torch=1.12.0;onnx=1.14.0UnsupportedONNXopsetversion:17 解决方案将scripts/export_onnx_model.py中的onnxopset的默认值(default=17)从“17”改为“11” 修改default为“11” 修改完毕后,再运行:  ......
  • 李超树浅谈
    李超树是一个可以多个分段一次函数,并取某个端点上所有一次分段函数的最值。基本李超树需要维护两个操作:在\([l,r]\)加入一条线段。询问在\(k\)处的最值。李超树中,每个节点我们存储的函数编号为在这个节点代表区间中点取得最值的函数编号。插入时,我们首先向线段树一样找......
  • SegmentTree2
    线段树完全版关键词:延迟加载、懒标记LazyTag单点更新的情况比较简单。请看线段树基础版下面说说区间更新的情况。场景是这样的,还是刚刚的数,求区间的和。准备工作//rt:root#definelsonrt<<1#definersonrt<<1|1#definelen(r-l+1)//(l,r)区间的长度这次是区间更新......
  • StarRocks Segment源码阅读笔记--SegmentIterator创建
    StarRocks中要读取Segment中的数据,需要先创建SegmentIteratorStatusOr<ChunkIteratorPtr>Segment::_new_iterator(constSchema&schema,constSegmentReadOptions&read_options){DCHECK(read_options.stats!=nullptr);//tryingtoprunethecurrentse......
  • SAM(segment-anything)解读-整理中
    sam的一个很重要的作用,用来寻找关注点算法来源:meta数据集:训练数据集一共1100万张,包含11亿个mask训练gpu:256块(如果是个人特殊需求,就需要微调,而且也只能微调)sam如何获取训练集?模型评估速度: ......
  • 1843E - Tracking Segments
    Problem-E-Codeforces题意是现在有n个0,给你m段序列,然后给你q次操作,每次操作给一个x,把第x个0变成1,问你最少几次操作能出现一段序列里的1的数量大于0的数量,如果不存在,输出-1对于操作数是一个递增序列。如果第k次操作后正好可行,那么就不用管k+1及以后了。所以可以使用二分来解......
  • AtCoder Regular Contest 164 E Segment-Tree Optimization
    洛谷传送门AtCoder传送门妙妙题。我们考虑如何方便地描述一棵广义线段树。不难想到使用断点描述,即对于一个结点\([l,r]\),它的左右儿子分别是\([l,mid],[mid+1,r]\),其中\(mid\in[l,r-1]\),然后把一层缩成一个\(2^{d-1}\)的序列,每一层都是上层对应结点的\(mid......