bzoj 3165: [Heoi2013]Segment 线段树
题目:
Description
要求在平面直角坐标系下维护两个操作:
- 在平面上加入一条线段。记第i条被插入的线段的标号为i。
- 给定一个数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 线段树的更多相关文章
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- BZOJ 3165: [Heoi2013]Segment
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 465 Solved: 187[Submit][Sta ...
- Bzoj 3165 [Heoi2013]Segment题解
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 668 Solved: 276[Submit][Sta ...
- BZOJ.3165.[HEOI2013]Segment(李超线段树)
BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...
- BZOJ_3165_[Heoi2013]Segment_线段树
BZOJ_3165_[Heoi2013]Segment_线段树 Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数 ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- codeforces 22E XOR on Segment 线段树
题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
随机推荐
- Sumdiv(较难数学题)
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20971 Accepted: 5290 Description Cons ...
- Gone Fishing(贪心)
Gone Fishing John is going on a fising trip. He has h hours available (1 ≤ h ≤ 16), and there are n ...
- 大数据学习系列(6)-- zookeeper集群搭建
下载 wget http://mirrors.shuosc.org/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz tar -zxvf ...
- 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 ...
- 【python】-- Socket
socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体 ...
- python 安装anaconda, numpy, pandas, matplotlib 等
如果没安装anaconda,则这样安装这些库: pip install numpy pip install pandas pip install matplotlib sudo apt-get ins ...
- Gradle-jar-aar
Ref:Android Studio系列教程 Ref:Android Studio系列教程四--Gradle基础 Ref:Intellij IDEA 14.x 中的Facets和Artifacts的区 ...
- Xen虚拟化基础篇
一.xen的简介 Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(& ...
- vim中设置tab的长度的方法
linux下使用vim编程是比較常见的事情,但vim默认的tab是8个空格.但一般的编辑器是4个空格,所以希望改动下.详细方法例如以下:1. 创建文件名称为 .vimrc 的系统文件首先切换到用户根文 ...
- nginx服务
nginx服务 一.nginx安装 1.yum安装:yum -y install nginx 注:centos 7中yum安装nginx前需要先安装 epel-release 2.源码包安装 安装之 ...