2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)
传送门
题意简述:要求支持两种操作:
- 插入一条线段。
- 询问与直线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(线段树)的更多相关文章
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- bzoj 3165: [Heoi2013]Segment 线段树
题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...
- BZOJ_3165_[Heoi2013]Segment_线段树
BZOJ_3165_[Heoi2013]Segment_线段树 Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数 ...
- 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)
传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...
- BZOJ3165: [Heoi2013]Segment(李超线段树)
题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...
- codeforces 22E XOR on Segment 线段树
题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...
- BZOJ3165 : [Heoi2013]Segment
建立线段树,每个节点维护该区间内的最优线段. 插入线段时,在线段树上分裂成$O(\log n)$棵子树,若与当前点的最优线段不相交,那么取较优的,否则暴力递归子树. 查询时在叶子到根路径上所有点的最优 ...
- 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. 这题 ...
- codeforces 242E. XOR on Segment 线段树
题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...
随机推荐
- 20165312 2017-2018-2 《JAVA程序设计》第5周学习总结
20165312 2017-2018-2 <JAVA程序设计>第5周学习总结 一.本周学习内容总结 总的来说,本周学习较吃力,在理解第十章的代码时速度较慢. 内部类 内部类是定义在一个类中 ...
- js中的数值转换
js中有3个函数可以把非数值转换为数值:Number().parseInt().parseFloat().其中Number()可以用于任何数据类型.parseInt()及parseFloat()用于将 ...
- Synchronized方法锁、对象锁、类锁区别
synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...
- i++ 是线程安全的吗?
相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑,i++ 居然还有线程安全问题?只能说自己了解的不够多,自己的水平有限. 先来看下面的示例来验 ...
- canal 配置 详细说明
git hub https://github.com/alibaba/canal canal.properties介绍:https://agapple.iteye.com/blog/1831873
- mysql 乐观锁实现
一.为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: 1.丢失更新:一个事 ...
- 查找单链表中倒数第K个位置上的结点,若查找成功返回该节点的data域,若不成功只返回0
算法的基本设计思想:定义两个指针变量p和q 初始时均指向头结点的下一个结点(即链表的第一个结点)p沿链表移动,当p移动到第k个结点时,q指针开始与p指针同时移动,当p指针移动到最后一个结点时,q指针 ...
- IDEA 工具从Json自动生成JavaBean
1.先安装GsonFormat插件:File-->Setting-->Plugins-->GsonFormat-->OK 2.new 一个新的Class空文件,然后 Alt+I ...
- cdnbest站点里设置防盗链
设置需求只允许 test.kangleweb.com 访问 ,其他网站链接全部拒绝 (注:如果test.kangleweb.com是用https访问,那引用的内容地址www447.yivpn.cn也 ...
- select2清除选择(选择框内的值)
首先清空option很简单:$("#select2_id").empty();但是这样清除了之后,选中的值仍然在文本框里显示着: 这个功能很小,只是一个函数的问题,之所以写这篇文章 ...