题目:

Description

要求在平面直角坐标系下维护两个操作:

  1. 在平面上加入一条线段。记第i条被插入的线段的标号为i。
  2. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号。

题解:

[SDOI 2016]游戏

还要简单一些,就不写题解了.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const ll maxn = 100010;
const ll maxp = 40010;
const double eps = 1e-9;
inline ll dcmp(double x){
return (x > eps) - (x < -eps);
}
struct Node{
double k,b;ll id;
bool vis;
Node(){id = 0;k = b = 0;}
}T[maxn<<2];
ll L,R,idx;double K,B;
inline void solve(ll rt,ll l,ll r){
if(T[rt].vis == false){
T[rt].k = K;T[rt].b = B;
T[rt].id = idx;
T[rt].vis = true;
return ;
}
double y0 = T[rt].k*l + T[rt].b;
double y1 = K*l + B;
double y2 = T[rt].k*r + T[rt].b;
double y3 = K*r + B;
if(dcmp(y1-y0) > 0 && dcmp(y3 - y2) > 0){
if(dcmp(K-T[rt].k) == 0 && dcmp(B - T[rt].b) == 0) return;
T[rt].k = K;T[rt].b = B;
T[rt].id = idx;
return ;
}
if(dcmp(y1-y0) <= 0 && dcmp(y3 - y2) <= 0) return ;
ll mid = l+r >> 1;
solve(rt<<1,l,mid);solve(rt<<1|1,mid+1,r);
}
inline void insert(ll rt,ll l,ll r){
if(L <= l && r <= R){
solve(rt,l,r);
return ;
}
ll mid = l+r >> 1;
if(L <= mid) insert(rt<<1,l,mid);
if(R > mid) insert(rt<<1|1,mid+1,r);
}
inline void insert(ll x0,ll x1,ll y0,ll y1,ll num){
L = x0;R = x1;K = (double)(y1-y0)/(double)(x1-x0);
B = y0 - x0*K;idx = num;insert(1,1,maxp);
}
typedef pair<ll,ll> pa;
double ans;ll ans_id;
inline void query(ll rt,ll l,ll r,ll pos){
double x = T[rt].k*pos + T[rt].b;
if(dcmp(x-ans) == 1 || (dcmp(x-ans) == 0 && T[rt].id < ans_id)) ans = x,ans_id = T[rt].id;
if(l == r) return ;
ll mid = l+r >> 1;
if(pos <= mid) query(rt<<1,l,mid,pos);
else query(rt<<1|1,mid+1,r,pos);
}
ll a[maxn],id[maxn];
int main(){
ll n;read(n);
ll lastans = 0;
ll op,x0,y0,x1,y1,x;
ll num = 0;
while(n--){
read(op);
if(op == 0){
read(x);
x = ((x +lastans-1)%39989+1);
ans = ans_id = 0;
query(1,1,maxp,x);
if(ans < a[x] || (ans == a[x] && id[x] < ans_id)) ans_id = id[x];
printf("%d\n",lastans = ans_id);
}else if(op == 1){
++ num;
read(x0);read(y0);read(x1);read(y1);
x0 = (x0+lastans-1)%39989+1;
y0 = (y0+lastans-1)%1000000000+1;
x1 = (x1+lastans-1)%39989+1;
y1 = (y1+lastans-1)%1000000000+1;
if(x0 > x1) swap(x0,x1),swap(y0,y1);
if(x0 == x1 ){
if(max(y0,y1) > a[x0]) a[x0] = max(y0,y1),id[x0] = num;
}else insert(x0,x1,y0,y1,num);
}
}
getchar();getchar();
return 0;
}

bzoj 3165: [Heoi2013]Segment 线段树的更多相关文章

  1. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  2. BZOJ 3165: [Heoi2013]Segment

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 465  Solved: 187[Submit][Sta ...

  3. Bzoj 3165 [Heoi2013]Segment题解

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 668  Solved: 276[Submit][Sta ...

  4. BZOJ.3165.[HEOI2013]Segment(李超线段树)

    BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...

  5. BZOJ_3165_[Heoi2013]Segment_线段树

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

  6. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  7. codeforces 22E XOR on Segment 线段树

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

  8. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  9. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

随机推荐

  1. Sumdiv(较难数学题)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20971   Accepted: 5290 Description Cons ...

  2. Gone Fishing(贪心)

    Gone Fishing John is going on a fising trip. He has h hours available (1 ≤ h ≤ 16), and there are n ...

  3. 大数据学习系列(6)-- zookeeper集群搭建

    下载 wget http://mirrors.shuosc.org/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz tar -zxvf ...

  4. Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks

    Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks S. Chen, C. F. N. Cow ...

  5. 【python】-- Socket

    socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体 ...

  6. python 安装anaconda, numpy, pandas, matplotlib 等

    如果没安装anaconda,则这样安装这些库: pip install numpy pip install pandas pip install matplotlib sudo apt-get ins ...

  7. Gradle-jar-aar

    Ref:Android Studio系列教程 Ref:Android Studio系列教程四--Gradle基础 Ref:Intellij IDEA 14.x 中的Facets和Artifacts的区 ...

  8. Xen虚拟化基础篇

    一.xen的简介 Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(& ...

  9. vim中设置tab的长度的方法

    linux下使用vim编程是比較常见的事情,但vim默认的tab是8个空格.但一般的编辑器是4个空格,所以希望改动下.详细方法例如以下:1. 创建文件名称为 .vimrc 的系统文件首先切换到用户根文 ...

  10. nginx服务

    nginx服务 一.nginx安装 1.yum安装:yum  -y install nginx 注:centos 7中yum安装nginx前需要先安装 epel-release 2.源码包安装 安装之 ...