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

P15100 [ICPC 2025 LAC] Festival Signs 题解

题意

给出一个数轴,数轴包含非整数的点,最初所有点的点权 \(w\)\(0\),现在有一些操作:

  • + l r h 表示向数轴上 \([l,r]\) 中的所有点的 \(w_i=\max(h,w_i)\)
  • - x 表示撤销第 \(x\)+ l r h 操作,保证这个操作没有被删除过。
  • ? l r 表示查询 \([l,r]\) 的最小点权。再次注意可以是非整数点,例如 \(1.5\)

题解

考虑线段树分治。我们先按照时间确定每个 + 操作存在的时间进行线段树分治。然后做一个区间取 \(\max\),区间查 \(\min\) 的线段树就好了,可以用类似标记永久化的思想简化代码。

然后为了使得这棵线段树可以进行原本的线段树分治操作,我们要记录线段树上所有点的修改来方便撤销。于是乎修改的时候记录一下就好了。注意数据范围,所以要离散化。

关于非整数点的操作,我们让离散化后所有点的下标 \(\times 2\) 就好了,具体原因很好理解。

整体时间复杂度为 \(O(n\log^2n)\)

code:

#include<bits/stdc++.h>
#define fi first
#define se second
#define ls (p<<1)
#define rs (p<<1|1)
#define pb push_back
#define int long long
#define pii pair<int,int>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=5e5+10;
int n,m,k,T,a[N],tot,cnt,tmp,t[N<<4];
pii b[N],q[N],st[N<<6];
struct node{int l,r,h;}e[N];
vector<int> g[N<<2];
int idx(int x){return (lower_bound(a+1,a+tot+1,x)-a)*2;} 
void pushup(int p){st[++tmp]={p,t[p]};t[p]=max(t[p],min(t[ls],t[rs]));
}
void mak(int p,int l,int r,int x,int y,int h){st[++tmp]={p,t[p]};t[p]=max(t[p],t[p>>1]);if(x<=l&&r<=y){if(t[p]<h){st[++tmp]={p,t[p]};t[p]=h;}return;}int mid=(l+r)>>1;if(x<=mid) mak(ls,l,mid,x,y,h);if(y>mid) mak(rs,mid+1,r,x,y,h);pushup(p);	
}
int query(int p,int l,int r,int x,int y){st[++tmp]={p,t[p]};t[p]=max(t[p],t[p>>1]);if(x<=l&&r<=y){return t[p];}int mid=(l+r)>>1,res=INT_MAX;if(x<=mid) res=min(res,query(ls,l,mid,x,y));if(y>mid) res=min(res,query(rs,mid+1,r,x,y));return max(t[p],res);	
}
void dele(int x){per(i,tmp,x+1) t[st[i].fi]=st[i].se;tmp=x;
}
void upd(int p,int l,int r,int k){int x=b[k].fi,y=b[k].se;if(x<=l&&r<=y){g[p].pb(k);return;}int mid=(l+r)>>1;if(x<=mid) upd(ls,l,mid,k);if(y>mid) upd(rs,mid+1,r,k);
}
void solve(int p,int l,int r){int x=tmp;for(int v:g[p]){mak(1,1,tot,e[v].l,e[v].r,e[v].h);}if(l==r){if(q[l].fi) cout<<query(1,1,tot,q[l].fi,q[l].se)<<'\n';dele(x);return;}int mid=(l+r)>>1;solve(ls,l,mid);solve(rs,mid+1,r);dele(x);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;rep(i,1,n){char c;cin>>c;if(c=='+'){int l,r,h;cin>>l>>r>>h;a[++tot]=l;a[++tot]=r;e[++cnt]={l,r,h};b[cnt].fi=i;}else if(c=='?'){int l,r;cin>>l>>r;a[++tot]=l;a[++tot]=r;q[i]={l,r};}else{int x;cin>>x;b[x].se=i;}}sort(a+1,a+tot+1);rep(i,1,cnt){if(b[i].fi&&b[i].se==0) b[i].se=n;e[i].l=idx(e[i].l);e[i].r=idx(e[i].r);}rep(i,1,n){if(q[i].fi){q[i].fi=idx(q[i].fi);q[i].se=idx(q[i].se);}}tot*=2;rep(i,1,cnt) upd(1,1,n,i);solve(1,1,n);return 0;
}
http://www.jsqmd.com/news/402831/

相关文章:

  • Cherry Studio 设置豆包绘图:新手入门指南与避坑实践
  • ChatTTS本地部署实战:基于Linux Docker的高效解决方案
  • C++ 多线程与并发系统取向(三)—— std::unique_lock:为什么它比 lock_guard 更“重”?
  • 从零构建电商客服智能体:基于Coze的实战开发指南
  • 漏洞扫描系统毕业设计:从零构建可扩展的实战架构
  • 智能客服对话机器人设计全流程:从架构设计到生产环境部署
  • 智能客服对话分析实战:基于NLP的AI辅助开发全流程解析
  • 2026年上海格拉苏蒂原创手表维修推荐:多场景服务评价,针对走时与保养痛点精准指南 - 十大品牌推荐
  • Spring SseEmitter 全面解析与使用示例
  • 2026年上海蒂芙尼手表维修推荐:基于多场景服务评价,针对走时与保养核心痛点指南 - 十大品牌推荐
  • 2026年上海梵克雅宝手表维修推荐:深度评测非官方维修站,聚焦核心商圈与长期质保 - 十大品牌推荐
  • ChatTTS 自定义样本实战:从数据准备到模型微调的最佳实践
  • 2026年上海飞亚达手表维修推荐:甄选官方售后网点评测,解决非官方维修核心痛点 - 十大品牌推荐
  • 真的太省时间了!AI论文写作软件 千笔·专业学术智能体 VS Checkjie,本科生专属神器!
  • ChatGPT苹果客户端安装全指南:从原理到高效部署实践
  • 2026年上海东方双狮手表维修推荐:多场景服务评价,针对走时与保养核心痛点指南 - 十大品牌推荐
  • 2026年上海法穆兰手表维修推荐:多场景服务评价,针对复杂机芯与外观修复痛点 - 十大品牌推荐
  • ConfyUI视频模型部署实战:从存储位置到生产环境优化
  • 国内MBR平板膜哪家强?2026年靠谱企业榜单揭晓,MBR膜污水处理设备/美国滨特尔水泵,MBR平板膜制造企业哪家权威 - 品牌推荐师
  • 从Chat Kimi到DeepSeek:主流AI助手的架构设计与性能优化实战
  • 2026年上海迪奥手表维修推荐:严选高端商圈服务网点排名,规避非官方维修风险 - 十大品牌推荐
  • 大学生志愿者平台毕设:从零构建高可用志愿活动管理系统的技术实践
  • 如何选择可靠手表维修点?2026年上海贝伦斯手表维修推荐与评测,解决网点分散痛点 - 十大品牌推荐
  • 2026年上海波尔手表维修推荐:多网点深度评测,解决非官方维修信任与便捷性痛点 - 十大品牌推荐
  • 当信息洪流淹没认知,摧毁思考
  • ChatGPT文件上传限制解析:原理、替代方案与AI辅助开发实践
  • 2026年上海帝舵手表维修推荐:多场景服务评价,针对售后时效与专业度痛点指南 - 十大品牌推荐
  • 行业视角:2026年高密度硅酸钙管托直销供应格局浅析,硬硅酸钙石保温板,高密度硅酸钙管托供应商口碑排行 - 品牌推荐师
  • 改稿速度拉满 8个降AIGC工具测评:专科生如何高效降AI率过关?
  • 2026年上海伯爵手表维修推荐:高端腕表维保趋势评测,涵盖日常与紧急维修场景痛点 - 十大品牌推荐