[ 李超线段树 ] BZOJ3165
裸题。
#include<bits/stdc++.h>
using namespace std;
inline char nc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void Read(int& x){char c=nc();for(;c<'0'||c>'9';c=nc());for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
const int N=100010;
const int M=40010;
const double Eps=1e-10;
struct Line{double k,b;
}a[N];
int k,n,m,p;
int c[M<<2];
int Ans;
int x,y,z;
inline int Get1(int x){return (x+Ans-1)%39989+1;
}
inline int Get2(int x){return (x+Ans-1)%1000000000+1;
}
inline double Calc(int id,int x){return a[id].k*x+a[id].b;
}
inline double Abs(double x){return x<0?-x:x;
}
inline bool Cmp(int x,int y,int z){if(!x)return 1;if(!y)return 0;double t1=Calc(x,z),t2=Calc(y,z);if(Abs(t1-t2)<Eps)return x>y;return t1<t2;
}
void Modify(int x,int l,int r,int y){if(!c[x])c[x]=y;if(Cmp(c[x],y,l))swap(c[x],y);if(l==r||Abs(a[c[x]].k-a[y].k)<Eps)return;double pos=(a[y].b-a[c[x]].b)/(a[c[x]].k-a[y].k);if(pos<l||pos>r)return;int Mid=l+r>>1;if(pos<=Mid)Modify(x<<1,l,Mid,c[x]),c[x]=y;else Modify(x<<1|1,Mid+1,r,y);
}
void Update(int x,int l,int r,int L,int R,int y){if(l>R||r<L)return;if(l>=L&&r<=R){Modify(x,l,r,y);return;}int Mid=l+r>>1;Update(x<<1,l,Mid,L,R,y);Update(x<<1|1,Mid+1,r,L,R,y);
}
int Query(int x,int l,int r,int y){if(l==r)return c[x];int Mid=l+r>>1,t;if(y<=Mid)t=Query(x<<1,l,Mid,y);else t=Query(x<<1|1,Mid+1,r,y);if(Cmp(t,c[x],y))return c[x];return t;
}
int main(){Read(n);for(int i=1;i<=n;i++){Read(k);if(!k){Read(x);x=Get1(x);Ans=Query(1,1,M,x);printf("%d\n",Ans);}else{Read(x);Read(y);Read(z);Read(k);x=Get1(x);y=Get2(y);z=Get1(z);k=Get2(k);m++;if(x==z)a[m].k=0,a[m].b=max(y,k);elsea[m].k=(double)(y-k)/(x-z),a[m].b=-a[m].k*x+y;if(x>z)swap(x,z);Update(1,1,M,x,z,m);}}return 0;
}
[ 李超线段树 ] BZOJ3165相关推荐
- 【BZOJ3165】Segment(李超线段树)
题目来源:BZOJ3165 考虑以横坐标为下标维护线段树. 在每个结点维护一个标记,表示覆盖整个结点的最高线段,注意这个标记对整个区间都有作用,无需下传. 因为只有单点询问,所以可以不用维护区间的最高 ...
- 【李超线段树】BZOJ3165 [Heoi2013]Segment
题面在这里 李超线段树的裸题,不解释 示例程序: #include<cstdio> #include<cmath> #include<algorithm> usin ...
- 李超线段树(Li-Chao Segment Tree)
李超线段树 李超线段树是一种用于维护平面直角坐标系内线段关系的数据结构.它常被用来处理这样一种形式的问题:给定一个平面直角坐标系,支持动态插入一条线段,询问从某一个位置 (X,+∞)(X,+\inft ...
- BZOJ 1568 李超线段树
思路: 李超线段树裸题 //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> # ...
- 【BZOJ 3165】 [Heoi2013]Segment 李超线段树
所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...
- P4097 [HEOI2013]Segment 李超线段树
传送门 文章目录 题意: 思路: 题意: 实现以下两个操作: (1)(1)(1)在平面上加入一条线段.记第iii条被插入的线段的标号为iii (2)(2)(2)给定一个数kkk,询问与直线x=kx=k ...
- 【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】
题意: n×mn\times mn×m 的网格图,每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j,bufi,j,从 (1,1)(1,1)(1,1) ...
- 【CEOI2017】Building Bridges【任意坐标斜率优化】【李超线段树】
题意:有 nnn 个柱子,每个柱子有高度 hih_ihi.你需要在柱子间修桥,在 i,ji,ji,j 间修桥代价为 (hi−hj)2(h_i-h_j)^2(hi−hj)2,桥梁只能在柱子处相交, ...
- 数据结构之线段树Ⅴ——(李超线段树)Robot,Product Sum,Building Bridges,Jump mission
文章目录 Robot Product Sum Building Bridges Jump mission Robot BZOJ3938 机器人每次一旦改变速度,直到下一次改变速度为止 这一时间段内机器 ...
最新文章
- Nodejs Express dockerfile最佳实践
- Datawhale组队学习周报(第032周)
- 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
- linux 查看lv格式,linux lv pv lv 命令
- 这才是真正的,坐上来,自己动!| 今日趣图
- 制作程序化装饰花纹图案_装饰图案
- 在windows环境下ftp服务器的文件上传和下载
- python svm 决策方程_python – 使用scikit-learn线性SVM提取决策边界
- Maven工具的简单介绍,以及manen与spring框架之前的优缺点,解决什么是maven、为什么要使用maven,使用maven的好处等问题
- html caption属性的值,如何设置caption属性
- 金地集团三季报:归母净利润同比降超三成,仍存债务压力
- python小乌龟绘制迷宫_用turtle不断的画回字迷宫
- 武汉大学 遥感院 数据结构实习
- 小黄衫获得感想及经验总结
- opencv自己生成标定板
- Android学习---zygote(上)
- 威威猫系列故事——吃鸡腿
- 课堂结对作业:二维数组(4)
- 家庭装修预约APP软件开发
- [技术经理]02 什么是技术经理?
热门文章
- 微信服务号开发----发送消息
- 计算机怎样发现路由器上u盘,路由器上USB插口的4大功能,估计你连一个都没用过...
- sourcemap功能简介
- TP-LINK路由器任意代码执行漏洞CVE-2017-9466 WR841N V8版本受影响
- Java数字化智慧校园平台源码,智慧学校源码+微信小程序+人脸电子班牌
- ps4和php,PS4《战神》通关心得分享与给新手的游玩建议
- “墨子号”量子科学实验卫星成果获克利夫兰奖
- Lighting - 光的亮度衰减
- 【基于stm32f103C8T6-小程序智能家居项目实战-自绘PCB到实现功能一条龙+30分钟解决-各种bug已修复】
- NINA项目里面已经加入架包“SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder”