题目:

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. 使用UIImageView展现来自网络的图片

    本文转载至 http://www.cnblogs.com/chivas/archive/2012/05/21/2512324.html UIImageView:可以通过UIImage加载图片赋给UII ...

  2. 【BZOJ1038】[ZJOI2008]瞭望塔 半平面交

    [BZOJ1038][ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如 ...

  3. 爬虫入门【5】PyQuery简介

    PyQuery 目前最新的版本是1.3,基于最新版本进行介绍. 主要根据PyQuery的官方文档进行了更新. from pyquery import PyQuery as pq from lxml i ...

  4. EasyNVR无插件直播服务器软件如何自己更改web界面(网页的自定修改)

    背景需求 很多用户都在使用了EasyNVR,看到EasyNVR自身带有的界面后有这样的需求,就是需要更改一下web前端的一些样式,当前EasyhNVR为3.0版本,web前端为了增加前端的运行效率和减 ...

  5. WebApi 中使用 Session

    1. 在 Global.asax.cs 文件中加入session支持 protected void Application_Start() { AreaRegistration.RegisterAll ...

  6. 九度OJ 1252:回文子串 (字符串处理、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:387 解决:224 题目描述: 输入一个字符串,输出该字符串中对称的子字符串的最大长度. 比如输入字符串"google" ...

  7. 九度OJ 1187:最小年龄的3个职工 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2291 解决:936 题目描述: 职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来. 输入: 输入第一行包括1个 ...

  8. 常见数据挖掘算法的Map-Reduce策略(2)

           接着上一篇文章常见算法的mapreduce案例(1)继续挖坑,本文涉及到算法的基本原理,文中会大概讲讲,但具体有关公式的推导还请大家去查阅相关的文献文章.下面涉及到的数据挖掘算法会有:L ...

  9. 关于python2中的unicode和str以及python3中的str和bytes

    python3有两种表示字符序列的类型:bytes和str.前者的实例包含原始的8位值:后者的实例包含Unicode字符. python2中也有两种表示字符序列的类型,分别叫做str和unicode. ...

  10. 每天一个Linux命令(20)find命令_exec参数

    find命令的exec参数,用于find查找命令完成以后的后续操作.     (1)用法: 用法:  [find命令]  [-exec  其他命令 {} \;]     (2)功能: 功能:-exec ...