传送门

题意简述:要求支持两种操作:

  1. 插入一条线段。
  2. 询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号。

思路:

直接上李超线段树即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
typedef double db;
const int mod=1e9+7,N=40005,M=100005;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
struct Line{int l,r,id;db k,b;}a[M];
const db eps=1e-6;
inline bool check(const int&x,const int&y,const int&z){
	if(!x)return 1;
	double t1=a[x].k*z+a[x].b,t2=a[y].k*z+a[y].b;
	return fabs(t1-t2)<=eps?x<y:t1<t2;
}
inline double calc(int x,int y){return (a[y].b-a[x].b)/(a[x].k-a[y].k);}
namespace SGT{
	#define lc (p<<1)
	#define rc (p<<1|1)
	#define mid (l+r>>1)
	int id[N<<2];
	inline void change(int p,int l,int r,int k){
		if(!id[p])id[p]=k;
		int l1=id[p],l2=k;
		if(check(l1,l2,l))swap(l1,l2);
		if(l==r||fabs(a[l1].k-a[l2].k)<=eps){id[p]=l1;return;}
		db x=calc(l1,l2);
		if(x<l||x>r){id[p]=l1;return;}
		if(x<=mid)return id[p]=l2,change(lc,l,mid,l1);
		return id[p]=l1,change(rc,mid+1,r,l2);
	}
	inline void update(int p,int l,int r,int k){
		if(a[k].l<=l&&r<=a[k].r)return change(p,l,r,k);
		if(a[k].r<=mid)update(lc,l,mid,k);
		else if(a[k].l>mid)update(rc,mid+1,r,k);
		else update(lc,l,mid,k),update(rc,mid+1,r,k);
	}
	inline int query(int p,int l,int r,int k){
		if(l==r)return id[p];
		int ret=k<=mid?query(lc,l,mid,k):query(rc,mid+1,r,k);
		return check(ret,id[p],k)?id[p]:ret;
	}
}
int main(){
	for(ri lastans=0,cnt=0,a0,a1,b0,b1,tt=read(),op;tt;--tt){
		op=read();
		if(!op)a0=(read()+lastans-1)%39989+1,cout<<(lastans=SGT::query(1,1,40000,a0))<<'\n';
		else{
			a0=(read()+lastans-1)%39989+1;
			b0=(read()+lastans-1)%1000000000+1;
			a1=(read()+lastans-1)%39989+1;
			b1=(read()+lastans-1)%1000000000+1;
			if(a0>a1)swap(a0,a1),swap(b0,b1);
			if(a0==a1)++cnt,a[cnt]=(Line){a0,a1,cnt,0,max(b0,b1)};
			else ++cnt,a[cnt]=(Line){a0,a1,cnt,(db)(b0-b1)/(db)(a0-a1),(db)((ll)a0*b1-(ll)a1*b0)/(db)(a0-a1)};
			SGT::update(1,1,40000,cnt);
		}
	}
	return 0;
}

2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)的更多相关文章

  1. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

  2. bzoj 3165: [Heoi2013]Segment 线段树

    题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...

  3. BZOJ_3165_[Heoi2013]Segment_线段树

    BZOJ_3165_[Heoi2013]Segment_线段树 Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数 ...

  4. 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)

    传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...

  5. BZOJ3165: [Heoi2013]Segment(李超线段树)

    题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...

  6. codeforces 22E XOR on Segment 线段树

    题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...

  7. BZOJ3165 : [Heoi2013]Segment

    建立线段树,每个节点维护该区间内的最优线段. 插入线段时,在线段树上分裂成$O(\log n)$棵子树,若与当前点的最优线段不相交,那么取较优的,否则暴力递归子树. 查询时在叶子到根路径上所有点的最优 ...

  8. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  9. codeforces 242E. XOR on Segment 线段树

    题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...

随机推荐

  1. 查询 SQL_Server 所有表的记录数: for xml path

    --我加了 top 10 用的时候可以去掉 declare @select_alltableCount varchar(max)='';with T as (select top 10 'SELECT ...

  2. windows shell命令相关

    一 系统自带的命令 1 创建文件夹 mkdir 文件夹名 2 强制删除文件夹 rd/s/q 文件夹名 3 强制删除文件 del/f/s/q 文件名 4 移动文件到文件夹 move 文件名 文件夹名 二 ...

  3. Let'sencrypt.sh 抛出异常: Response: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)>

    起因 今天网站的SSL证书过期了,打算重新申请,运行 Let'sencrypt.sh 的时候抛出了这么个异常. 一番搜索,发现居然找不到直接的答案.没有直接的答案就只能通过间接的答案来解决了. 希望我 ...

  4. node和npm的安装和镜像源的修改

    在node官网下载https://nodejs.org/en/ 直接下载msi的文件,需要配置环境变量 我的电脑-->属性-->高级系统配置-->环境变量-->用户变量,在用户 ...

  5. QTP 学习 - 参数化

  6. IDEA run下output标签悬浮/弹出状态

    就是这样,在哪儿有一个恢复布局标签

  7. ActiveMQ(1)---初识ActiveMQ

    消息中间件的初步认识 什么是消息中间件? 消息中间件是值利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,可以在分布式架构下扩展进 ...

  8. TP5 自定义验证器

    TP内置验证功能提供两种验证方法 验证器(推荐) $validate = Validate::make([ 'id' => 'require|integer', ]); if ($validat ...

  9. Python学习笔记---切片 列表 元祖 字典 集合

    列表[1,2,3,2]#[] 元祖(1,2,3,2)#() 字典{1:2,3:2}#{} 集合{1,2,3,2}#{} 1,集合与列表的区别,集合里不能有重复元素 2.字典与集合的区别,都是用花括号表 ...

  10. 使用appium做自动化测试时,send_keyss只能输入字母数字,无法输入中文

    解决方案: driver中增加以下2行配置: "unicodeKeyboard":True, #unicode编码输入 "resetKeyboard":True ...