3165: [Heoi2013]Segment

Time Limit: 40 Sec  Memory Limit: 256 MB
Submit: 465  Solved: 187
[Submit][Status][Discuss]

Description

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

Input

第一行一个整数n,表示共n 个操作。 
接下来n行,每行第一个数为0或1。 
 
若该数为 0,则后面跟着一个正整数 k,表示询问与直线  
x = ((k +lastans–1)%39989+1)相交的线段中交点(包括在端点相交的情形)最靠上的线段的编号,其中%表示取余。若某条线段为直线的一部分,则视作直线与线段交于该线段y坐标最大处。若有多条线段符合要求,输出编号最小的线段的编号。 
若该数为 1,则后面跟着四个正整数 x0, y0, x 1, y 1,表示插入一条两个端点为 
((x0+lastans-1)%39989+1,(y0+lastans-1)%10^9+1)和((x
1+lastans-1)%39989+1,(y1+lastans-1)%10^9+1) 的线段。 
其中lastans为上一次询问的答案。初始时lastans=0。

Output

对于每个 0操作,输出一行,包含一个正整数,表示交点最靠上的线段的编号。若不存在与直线相交的线段,答案为0。

Sample Input

6
1 8 5 10 8
1 6 7 2 6
0 2
0 9
1 4 7 6 7
0 5

Sample Output

2
0 3

HINT

对于100%的数据,1 ≤ n ≤ 10^5 , 1 ≤  k, x0, x1 ≤ 39989, 1 ≤ y0 ≤ y1 ≤ 10^9。

Source

 

[Submit][Status][Discuss]

HOME Back

线段树维护线段,23333

 #include <bits/stdc++.h>

 struct line
{
int lt, rt;
double k, b; line(void) {}; line(int x0, int y0, int x1, int y1)
{
if (x0 < x1)
lt = x0, rt = x1;
else
lt = x1, rt = x0; if (x0 == x1)
{
k = 0.0;
b = y0 > y1 ? y0 : y1;
}
else
{
k = 1.0 * (y0 - y1) / (x0 - x1);
b = y0 - x0 * k;
}
} inline double f(int x)
{
return k * x + b;
}
}ln[]; int tot; int sg(double x)
{
static const double eps = 1e-; return (x > -eps) - (x < +eps);
} int cross(int i, int j)
{
return floor((ln[i].b - ln[j].b) / (ln[j].k - ln[i].k));
} int flg[]; int wi[]; double wy[]; inline void update(int x, int p)
{
double y = ln[p].f(x); int s = sg(y - wy[x]); if (!wi[x] || s > || (!s && p < wi[x]))
wi[x] = p, wy[x] = y;
} void insert(int t, int l, int r, int p)
{
if (ln[p].lt <= l && ln[p].rt >= r)
{
if (!flg[t])flg[t] = p;
else
{
int mid = (l + r) >> ; bool lu = sg(ln[p].f(l) - ln[flg[t]].f(l)) > ;
bool ru = sg(ln[p].f(r) - ln[flg[t]].f(r)) > ; if (lu && ru)flg[t] = p;
else if (lu || ru)
{
int tt = cross(p, flg[t]);
if (tt <= mid)
{
if (lu)
insert(t << , l, mid, p);
else
insert(t << , l, mid, flg[t]), flg[t] = p;
}
else
{
if (ru)
insert(t << | , mid + , r, p);
else
insert(t << | , mid + , r, flg[t]), flg[t] = p;
}
}
else
{
update(l, p);
update(r, p);
}
}
}
else
{
int mid = (l + r) >> ; if (ln[p].lt <= mid)
insert(t << , l, mid, p);
if (ln[p].rt > mid)
insert(t << | , mid + , r, p);
}
} int ansi; double ansy; void query(int t, int l, int r, int x)
{
if (flg[t])
{
double y = ln[flg[t]].f(x); int s = sg(y - ansy); if (s > || (!s && flg[t] < ansi))
ansi = flg[t], ansy = y;
} if (l != r)
{
int mid = (l + r) >> ; if (x <= mid)
query(t << , l, mid, x);
if (x > mid)
query(t << | , mid + , r, x);
}
} signed main(void)
{
int n; scanf("%d", &n); for (int ans = ; n--; )
{
int op; scanf("%d", &op); if (op) // insert segment
{
int x0, y0, x1, y1; scanf("%d%d%d%d", &x0, &y0, &x1, &y1); x0 = (x0 + ans - ) % + ;
x1 = (x1 + ans - ) % + ;
y0 = (y0 + ans - ) % + ;
y1 = (y1 + ans - ) % + ; ln[++tot] = line(x0, y0, x1, y1); insert(, , , tot);
}
else // query segment
{
int x; scanf("%d", &x); x = (x + ans - ) % + ; ansi = wi[x], ansy = wy[x]; query(, , , x); printf("%d\n", ans = ansi);
}
}
}

@Author: YouSiki

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: 668  Solved: 276[Submit][Sta ...

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

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

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

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

  5. 【BZOJ3165】[HEOI2013]Segment(李超线段树)

    [BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...

  6. 洛谷 P4097 [HEOI2013]Segment 解题报告

    P4097 [HEOI2013]Segment 题目描述 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 给定一个数 \(k\),询问 ...

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

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

  8. 【BZOJ 3165】【HEOI 2013】Segment

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

  9. BZOJ 3165 Segment

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

随机推荐

  1. JUC——阻塞队列

    Queue是一个队列,而队列的主要特征是FIFO先进先出,要实现生产者与消费者模型,也可以采用队列来进行中间的缓冲读取,好处是:生产者可以一直不停歇的生产数据. BlockingQueue是Queue ...

  2. NO17--vue父子组件间单向数据流的解决办法

    在上一篇中讲解了父子组件之间是如何传值的,如果子组件需要改变传过来的数据供自己使用,或者想在子组件中改变传过来的数据并同步到父组件,那么直接改肯定是不行的,如果你这么做了,Vue 会在控制台给出警告. ...

  3. VS Code配置初探

    之前一直在用 Webstorm,看现在 VS Code 热度那么高,想着尝试一下. 熟悉编辑器的快捷键 VS Code 快捷键一览 安装使用到的插件 Chinese(修改你的编辑器语言,默认英文) E ...

  4. JAVA之访问控制符

    1.访问修饰符 public:该类和非该类的均能访问 protect:该类和该类的子类,同一个包内的成员也能访问 默认:同一个包内的类可以访问 private:只有该类可以访问 特性:在继承的关系中, ...

  5. docker实现跨主机连接

    实验环境: centos7系统 host1:192.168.42.128 host2:192.168.42.129 dokcer容器跨主机连接 1.使用网桥实现跨主机容器连接 2.使用Open vSw ...

  6. Scrum Meeting 10.25

    成员 已完成任务 下一阶段任务 用时 徐越 阅读前端代码中和通信相关的部分 学习服务器配置 4h 赵庶宏 阅读前端代码中和通信相关的部分 学习服务器配置 4h 薄霖 继续做UI开发 界面优化 4h 武 ...

  7. 团队博客作业Week2 --- 学长学姐访谈录

    ## 团队作业2 ## ### 团队一 ### 这个团队中组员是位研一的学姐,她的软件工程老师是姚淑珍,当时她们团队总共有4个人,而且她们都很努力,但是可能是最后团队的作品不太理想,她们的软件并没有上 ...

  8. vim相关命令单独记载

    1. 无敌的可扩展性 1.1 可扩展性给了软件强大的生命 曾几何时,Windows用户对软件的可扩展性没有概念,他们只能对他们使用的软件进行非常有限的定制.扩展软件的权利保留在软件开发者手中.软件的使 ...

  9. 信息安全系统设计基础_exp1

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础 班级:1353 姓名:吴子怡.郑伟 学号:20135313.20135322 指导教师: 娄嘉鹏 实验 ...

  10. Percona XtraDB Cluster 5.7

    附加:相关在线文档https://www.percona.com/software/documentation 安装要求: 1.root权限2.保证开放3306.4444.4567.4568端口3.关 ...