题意:

给出平面上一些线段,在线询问与x=x0相交的线段中,交点y最大的线段的标号,支持添加线段。

大概思路:

用线段树维护,线段树每个线段记录贯穿(左右端点在该区间外或上)的原线段中能覆盖其它贯穿该线段的原线段(即每个线段树线段记录贯穿该线段的所有原线段中“最高”的)

细节:

添加原线段s到线段树线段nd:

如果s不能覆盖,根据s的大小传递到左儿子或右儿子或都传

如果s覆盖,

如果原本没有线段,则直接设置为s

   如果有线段ss,求s与ss的交点,将短(比较x上投影的长度)的线段“压”到交点所在儿子,长的变成本区间的。

  (要注意如果y相等,比较标号)

查询x

  查询覆盖x的所有区间的线段树线段对应的原线段(有的话)中在x处y最大的。

 /**************************************************************
Problem: 3165
User: idy002
Language: C++
Result: Accepted
Time:1492 ms
Memory:4244 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <vector>
#define lson nd<<1
#define rson nd<<1|1
#define maxn 100010
#define modx 39989
#define mody 1000000000
#define eps 1e-10
using namespace std; int sg( double x ) {
return (x>-eps)-(x<eps);
}
struct Line {
int lf, rg;
double k, b;
Line(){}
Line( int x0, int y0, int x1, int y1 ) {
lf = min( x0, x1 );
rg = max( x0, x1 );
if( x0==x1 ) {
k = 0.0;
b = max( y0, y1 );
} else {
k = (y1-y0+0.0)/(x1-x0);
b = y1-x1*k;
}
}
inline double f( int x ) {
return k*x+b;
}
inline double cx( Line &c ) {
return (c.b-b)/(k-c.k);
}
}; int n;
int ltot;
Line lns[maxn];
int v[(modx+)<<];
int wi[modx+];
double wy[modx+]; void update( int x, int i ) {
double ny = lns[i].f(x);
int s=sg(ny-wy[x]);
if( !wi[x] || (s> || (s==&&i<wi[x])) ) {
wi[x] = i;
wy[x] = ny;
}
}
void modify( int i, int nd, int lf, int rg ) {
if( lns[i].lf<=lf && rg<=lns[i].rg ) {
if( !v[nd] ) {
v[nd] = i;
return;
}
bool lu = sg( lns[i].f(lf)-lns[v[nd]].f(lf) )>;
bool ru = sg( lns[i].f(rg)-lns[v[nd]].f(rg) )>;
int mid=(lf+rg)>>;
if( lu && ru ) {
v[nd] = i;
} else if( lu || ru ) {
int lm = floor( lns[i].cx( lns[v[nd]] ) );
if( lm<=mid && lu ) {
modify( i, lson, lf, mid );
} else if( lm<=mid && ru ) {
modify( v[nd], lson, lf, mid );
v[nd] = i;
} else if( lu ) {
modify( v[nd], rson, mid+, rg );
v[nd] = i;
} else {
modify( i, rson, mid+, rg );
}
} else {
update( lf, i );
update( rg, i );
}
return;
}
int mid = (lf+rg)>>;
if( lns[i].lf<=mid ) modify( i, lson, lf, mid );
if( lns[i].rg>mid ) modify( i, rson, mid+, rg );
}
int query( int x ) {
int nd = ;
int lf = , rg = modx;
int rt = ;
double cury = -1.0;
while() {
if( v[nd] ) {
double ny = lns[v[nd]].f(x);
int s = sg( ny-cury );
if( s> || (s==&&v[nd]<rt) ) {
rt = v[nd];
cury = ny;
}
}
if( lf==rg ) break;
int mid=(lf+rg)>>;
if( x<=mid ) {
nd = lson;
rg=mid;
} else {
nd = rson;
lf=mid+;
}
}
int s = sg( wy[x]-cury );
if( s> || (s==&&wi[x]<rt) )
return wi[x];
return rt;
} int main() {
int T, lastans=;
scanf( "%d", &T );
while( T-- ) {
int opt;
scanf( "%d", &opt );
if( opt== ) {
int x;
scanf( "%d", &x );
x = ((x+lastans-)%modx+);
printf( "%d\n", lastans=query(x) );
} else {
int x0, y0, x1, y1;
scanf( "%d%d%d%d", &x0, &y0, &x1, &y1 );
x0 = (x0+lastans-)%modx+;
y0 = (y0+lastans-)%mody+;
x1 = (x1+lastans-)%modx+;
y1 = (y1+lastans-)%mody+;
lns[++ltot] = Line(x0,y0,x1,y1);
modify( ltot, , , modx );
}
}
}

bzoj 3165的更多相关文章

  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(李超线段树)

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

  3. BZOJ 3165: [Heoi2013]Segment

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

  4. Bzoj 3165 [Heoi2013]Segment题解

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

  5. 【BZOJ 3165】【HEOI 2013】Segment

    往区间上覆盖一次函数,做法是用线段树维护标记永久化. 每次都忘了线段树要4倍空间,第一次交总是RE,再这么手残的话考场上就真的要犯逗了. #include<cstdio> #include ...

  6. BZOJ 3165 Segment

    同上题. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&g ...

  7. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树

    所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...

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

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

  9. BZOJ 3165 李超线段树

    思路: 李超线段树 我是把线段转成斜率的形式搞得 不知道有没有更简单的方法 //By SiriusRen #include <cmath> #include <cstdio> ...

随机推荐

  1. HDU 1394 Minimum Inversion Number (树状数组)

    题目链接 Problem Description The inversion number of a given number sequence a1, a2, ..., an is the numb ...

  2. Fiddler 抓包工具总结(转)

    阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statistics 请求的性能数据分析 3). Inspectors 查看数据内容 4). AutoResponder 允许拦截制 ...

  3. Spring Boot企业级博客系统实战视频教程

    欢迎关注我的微信公众号:"Java面试通关手册" 回复关键字" springboot "免费领取(一个有温度的微信公众号,期待与你共同进步~~~坚持原创,分享美 ...

  4. ConcurrentHashMap分析

    1.ConcurrentHashMap锁分段技术                     ConcurrentHashMap使用锁分段技术,首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一 ...

  5. Deep Learning基础--理解LSTM网络

    循环神经网络(RNN) 人们的每次思考并不都是从零开始的.比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始.你的记忆是有 ...

  6. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)

    URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上. 实现所有这些神奇 ...

  7. 网页转图片,html生成图片,网页生成图片(基于linnux+phantomjs)和wkhtmltoimage

    安装扩展:  (1)下面是我在linux上的安装过程,如果没有安装git请先yum install git    安装casperjs    cd /    git clone git://githu ...

  8. [笔记]Linux NTP命令 (ESX适用)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://delxu.blog.51cto.com/975660/307513 [推荐阅读] ...

  9. xcode上真机调试iphone4s出现“There was an internal API error.”解决方案

    xcode7更新之后使用真机调试,在IOS8的一台Iphone5手机上面没什么问题,IOS8的一台iphone6也没问题.但是在IOS6的一台Iphone4s和 IOS7的ipad air2上面在最后 ...

  10. JavaScript 兼容性总结

     请实现鼠标点击任意标签,alert该标签的名称(注意兼容性) function elementName(evt){ evt = evt|| window.event; var selected = ...