当前位置: 首页 > news >正文

洛谷 P4097 【模板】李超线段树 / [HEOI2013] Segment - Rye

不管了先贴一个板子上来坑这周六再填。

#include<bits/stdc++.h>
using namespace std;
const int mod1=39989;
const int mod2=1e9;
const int maxt=40000;
const double eps=1e-9;
using mkp=pair<double,int>; // make pair 
int cmp(double x,double y){if(x-y>eps) return 1;if(y-x>eps) return -1;return 0;
}
struct line{double k,b;}; // 一次函数斜率和 y 轴截距; 
line p[100005];
int s[200005],cnt;
double calc(int id,int d){return p[id].k*d+p[id].b;} // d 为横坐标,id 为线段编号; 
void add(int x0,int y0,int x1,int y1){ // 线段起始坐标和结束坐标;  cnt++;if(x0==x1) // 特判垂直于 x 轴的情况(没有斜率);  p[cnt].k=0,p[cnt].b=max(y0,y1);elsep[cnt].k=1.0*(y1-y0)/(x1-x0),p[cnt].b=y0-p[cnt].k*x0; // 算斜率和 y 轴截距; return;
}
void merge(int id,int cl,int cr,int u){ // 对线段完全覆盖到的区间进行修改;  int &v=s[id],mid=(cl+cr)/2;int bmid=cmp(calc(u,mid),calc(v,mid)); // 计算中点处原直线更靠上还是当前直线更靠上; if(bmid==1||(bmid==0&&u<v)) swap(u,v);int bl=cmp(calc(u,cl),calc(v,cl)),br=cmp(calc(u,cr),calc(v,cr)); // 通过计算左端点处和右端点处的原线段、新线段的上下判断与区间原线段的交点位于左区间还是右区间; if(bl==1||(bl==0&&u<v)) merge(id*2,cl,mid,u);if(br==1||(br==0&&u<v)) merge(id*2+1,mid+1,cr,u);return;
}
void update(int id,int cl,int cr,int l,int r,int u){ // 定位插入线段完全覆盖到的区间;  if(l<=cl&&cr<=r){merge(id,cl,cr,u);return;}int mid=(cl+cr)/2;if(l<=mid) update(id*2,cl,mid,l,r,u);if(r>mid) update(id*2+1,mid+1,cr,l,r,u);return;
}
mkp pmax(mkp x,mkp y){if(cmp(x.first,y.first)==-1) return y;else if(cmp(x.first,y.first)==1) return x;else return x.second<y.second?x:y;
}
mkp query(int id,int l,int r,int d){ // 查询;  if(r<d||d<l) return {0,0}; // 不包含; int mid=(l+r)/2;double res=calc(s[id],d);if(l==r) return {res,s[id]};return pmax({res,s[id]},pmax(query(id*2,l,mid,d),query(id*2+1,mid+1,r,d))); // 那很长了;  
}
int main(){int n,lastans=0;scanf("%d",&n);while(n--){int op;scanf("%d",&op);if(op==1){ // 插入;  int x0,y0,x1,y1;scanf("%d%d%d%d",&x0,&y0,&x1,&y1);x0=(x0+lastans-1+mod1)%mod1+1,x1=(x1+lastans-1+mod1)%mod1+1;y0=(y0+lastans-1+mod2)%mod2+1,y1=(y1+lastans-1+mod2)%mod2+1; // 恶心人的强制在线; if(x0>x1) swap(x0,x1),swap(y0,y1);add(x0,y0,x1,y1),update(1,1,mod1,x0,x1,cnt);}else{ // 查询;  int x;scanf("%d",&x);x=(x+lastans-1+mod1)%mod1+1,lastans=query(1,1,mod1,x).second;printf("%d\n",lastans);}}return 0;
}
http://www.jsqmd.com/news/811710/

相关文章:

  • 技术新人最常犯的5个错误,第3个几乎人人都中招——软件测试从业者深度指南
  • A2 如何向AI描述需求(提示词模板库)
  • Deeplearning4j完全指南
  • 别再为进度条出图发愁了!手把手教你扩展Unity UGUI Image组件,让Filled模式完美支持九宫格
  • 如何永久免费使用AI编程助手:Cursor Free VIP完整指南
  • AI从入门到精通:一条清晰的脉络,带你读懂机器学习、深度学习与大模型的底层逻辑!
  • 实在Agent实测:解决采购合同审核流程冗长与原材料交付周期拉长的架构之道
  • 说说损失膝盖的行为和保护膝盖的方法
  • NSGA-III算法详解:从‘参考点’这个核心概念出发,彻底搞懂多目标优化新思路
  • 2026.5.9
  • 进阶篇如何学习编写 Shell 脚本?
  • AI工程化实战:四层驾驭模型解决开发盲区,打造稳定智能工作流
  • AI生物标志物发现:从海量数据中找真正的信号
  • Cursor Pro激活器:3分钟永久解锁AI编程助手高级功能
  • 2711P-K7C4D1 触摸屏面板
  • 数据流架构芯片深度科普:打破指令围墙,让数据像水一样流动
  • 【Oracle数据库指南】第32篇:Oracle归档日志管理与LogMiner日志分析
  • 5月13号
  • 告别裸机轮询:用STM32CubeMX+外部中断实现高效按键响应(附F072工程源码)
  • OLED内卷之王?微星MPG 271QR QD-OLED X50流光到底值不值得买
  • RAG系统落地秘籍:一张图看懂5大模块如何构建高效问答平台!
  • 第九届河北省大学生程序设计竞赛 L题思路分享(数学,三阶差分)
  • 【Oracle数据库指南】第35篇:Oracle特殊对象——簇与索引组织表(IOT)
  • 乌海豆包AI推广找哪家?宁夏壹山网络全域AI营销实力甄选 - 宁夏壹山网络
  • Confluence数据迁移踩坑实录:从物理机到K8s集群,我是如何无损迁移200G知识库的?
  • 深度解析:城通网盘直连地址获取技术方案
  • 告别裸奔MCU!手把手教你用OSAL调度器重构STM32项目(附看门狗实战)
  • GPT-4 Turbo访问权、优先响应、高级数据分析——ChatGPT Plus五大隐藏权益深度拆解,92%用户根本没用全
  • 2026实测|10款去AI痕迹工具红黑榜 - 殷念写论文
  • Taotoken在数据预处理与分析脚本中调用大模型的集成案例