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

题解:P11833 [省选联考 2025] 推箱子

P11883

一开始点开讨论区看到一哥们说什么权值线段树,我就直接开始想维护每个时间点被谁用了,想想这真是个笑话,于是看了题解。
首先考虑按照 \(t\) 从小到大依次移动,如果路上遇到挡道的,那就直接粘连起来一并往前推,这个显然正确的。
然后你总得考虑维护什么东西,你考虑维护每一个箱子的目前的位置相关的信息,我们把目前的位置记作 \(f_i\)。然后你维护这玩意的目的其实就是快速返回一个箱子挪到目的地所需要的时间嘛,那你考虑一下箱子挪动的情况。进行一个箱子的挪动不是可能会波及到它路程上的其它箱子吗,这太麻烦了于是我们总体考虑:如果箱子往左挪,那么就是初始的位置和减去末尾的位置和,反过来就是末尾减初始。
然后考虑一个箱子 \(j\) 何时会被一个向左挪的 \(i\) 带动,显然是 \(b_i - (i - j - 1) \le f_j\) 的情况。我们把 \(i\)\(j\) 分别放到两边,可得 \(b_i - i + 1 \le f_j - j\)。然后我们注意力惊人地发现每次被带动的箱子其实是连续的一段,这启发我们用二分来找最后一个满足该条件的箱子 \(j\),然后 \(f_j - j\) 其实又是单调的,所以直接线段树上二分即可,但是要写两个(。这个时候,我们其实就可以考虑维护 \(f_i - i\) 了,那么注意到这个 \(i\) 其实是不变的,那么直接用这个做差求移动时间是正确的。那么考虑移动之后每一个 \(f_i - i\) 会变成什么,显然是变成和这一粘连段最左边的 \(f_i - i\) 一样的值。向右挪同理,那么只需要维护一个支持区间推平,线段树二分,总体求和的线段树即可。\(T \le 6\),你比幸运数字出题人要好。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+7;
int n,a[N],b[N],t[N],ord[N];
struct SGT{#define ls (x<<1)#define rs ((x<<1)|1)#define mid ((l+r)>>1)int v[N<<2],lz[N<<2],mn[N<<2],mx[N<<2];void pu(int x){v[x]=v[ls]+v[rs];mn[x]=min(mn[ls],mn[rs]);mx[x]=max(mx[ls],mx[rs]);}void build(int x,int l,int r){lz[x]=-1; if(l==r) return v[x]=mx[x]=mn[x]=a[l]-l,void();build(ls,l,mid),build(rs,mid+1,r),pu(x);}void pd(int x,int l,int r){if(lz[x]==-1) return;v[ls]=(mid-l+1)*lz[x],v[rs]=(r-mid)*lz[x];mn[ls]=mn[rs]=mx[ls]=mx[rs]=lz[x];lz[ls]=lz[rs]=lz[x]; lz[x]=-1;}int whsum(){return v[1];}void mdf(int x,int l,int r,int ql,int qr,int k){if(ql<=l&&r<=qr){mn[x]=mx[x]=lz[x]=k;v[x]=(r-l+1)*k; return;}pd(x,l,r);if(ql<=mid) mdf(ls,l,mid,ql,qr,k);if(mid<qr)  mdf(rs,mid+1,r,ql,qr,k);pu(x);}int fdl(int x,int l,int r,int k){if(l==r) return l;if(mx[ls]>=k) return fdl(ls,l,mid,k);return fdl(rs,mid+1,r,k);}int fdr(int x,int l,int r,int k){if(l==r) return l;if(mn[rs]<=k) return fdr(rs,mid+1,r,k);return fdr(ls,l,mid,k);}int pos(int x,int l,int r,int q){if(l==r) return v[x]+l;if(q<=mid) return pos(ls,l,mid,q);else return pos(rs,mid+1,r,q);}
} Misaka;
bool cmp(int x,int y){return t[x]<t[y];};
void solve(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>t[i],ord[i]=i;sort(ord+1,ord+n+1,cmp);Misaka.build(1,1,n); int cur=0;for(int j=1,i=ord[j];j<=n;j++,i=ord[j]){int f=Misaka.pos(1,1,n,i);int pre=Misaka.whsum();if(b[i]<f){int lb=Misaka.fdl(1,1,n,b[i]-i+1);Misaka.mdf(1,1,n,lb,i,b[i]-i);cur+=pre-Misaka.whsum();}else if(b[i]>f){int rb=Misaka.fdr(1,1,n,b[i]-i-1);Misaka.mdf(1,1,n,i,rb,b[i]-i);cur+=Misaka.whsum()-pre;}if(cur>t[i]) return cout<<"No\n",void();}cout<<"Yes\n";
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int c,t; cin>>c>>t;while(t--) solve();return 0;
}
http://www.jsqmd.com/news/427110/

相关文章:

  • Nanbeige 4.1-3B极简UI部署:像玩手机一样与AI对话
  • 2026年3月武汉物流运输/货运代理/仓储服务/包装服务公司精选与采购指南 - 2026年企业推荐榜
  • 分期乐京东卡回收流程揭秘:快速、可靠又省心! - 团团收购物卡回收
  • RVC语音克隆零基础入门:3分钟极速训练你的专属AI歌手
  • 软件运维 --- Clonezilla备份系统
  • 2026年 卫衣品牌厂家推荐排行榜:薄款厚款男女款,可水洗纯棉卫衣,简约复古潮流经典款,个性舒适贴肤透气百搭精选 - 品牌企业推荐师(官方)
  • Qwen3-ForcedAligner-0.6B在C++项目中的集成指南
  • 2026年羽绒服品牌实力推荐榜:薄款厚款男女新款精选,可水洗抗皱百搭设计,涵盖简约复古潮流街头风,通勤日常防晒全能之选 - 品牌企业推荐师(官方)
  • 南北阁Nanbeige4.1-3B与STM32F103C8T6开发实战
  • 低查重的AI教材编写秘籍,AI教材生成工具助力高效创作!
  • DeepSeek-OCR部署实操:NVIDIA Container Toolkit配置与GPU资源限制设置
  • 分期乐京东卡回收流程到底有多简单?一文搞定! - 团团收购物卡回收
  • 基于Chord的无人机视频分析:空中监控新范式
  • 高效神器来袭!AI生成教材,低查重且连贯,一次搞定!
  • 致奋飞咨询的一封感谢信:携手共筑可持续发展之路 - 奋飞咨询ecovadis
  • ChatTTS在智能硬件集成中的应用:嵌入式设备轻量级语音合成方案
  • FPGA加速:用Verilog实现LongCat-Image-Edit的专用计算单元
  • AI写教材必备!低查重工具推荐,让教材编写不再困难
  • StructBERT中文语义系统部署:Kubernetes集群中高可用部署方案
  • 告别复杂命令!VideoAgentTrek Screen Filter实战:Web界面三步完成屏幕内容检测
  • window如何telnet ?先安装工具
  • AI生成教材利器推荐!低查重编写,满足各类教学需求!
  • 求排列:swap交换法
  • Windows牛逼还是Linux牛逼?这场争论,纯属浪费时间
  • 专业干货:低查重AI教材写作工具的使用方法与优势!
  • 造相Z-Image模型软件测试指南:确保生成质量与稳定性
  • 一天一个Python库:jsonschema - JSON 数据验证利器
  • 开箱即用:皇城大门春联生成终端部署指南,小白也能轻松上手
  • Ostrakon-VL-8B模型推理性能测试:从YOLOv8检测到VL理解的端到端延迟分析
  • 零基础玩转Neeshck-Z-lmage_LYX_v2:手把手教你本地AI绘画