P7424 [THUPC2017] 天天爱射击
我们发现,考虑每个子弹击碎哪些木板是不现实的,所以我们要转换问题:考虑每个木板被哪个子弹击碎
考虑可持久化线段树,转换问题成求区间
上代码:
#include<bits/stdc++.h> #define ll long long using namespace std; const ll N=2e5+50,M=2e5; ll n,m; ll x1[N],x2[N],s[N]; struct jgt { ll pos,ti; }zd[N]; bool cmp(jgt t1,jgt t2) { return t1.pos<t2.pos; } struct jgt1 { ll l,r,gs; }tr[N*20]; ll rt[N],tot; ll ans[N],sr[N]; void add(ll &now,ll last,ll l,ll r,ll x) { now=++tot; tr[now]=tr[last]; tr[now].gs++; if(l==r) return ; ll mid=(l+r)>>1; if(x<=mid) add(tr[now].l,tr[last].l,l,mid,x); else add(tr[now].r,tr[last].r,mid+1,r,x); } void find(ll now,ll last,ll l,ll r,ll x) { if(l==r) { ans[l]++; return ; } if(tr[now].gs-tr[last].gs<x) return; ll mid=(l+r)/2; ll tzy=tr[tr[now].l].gs-tr[tr[last].l].gs; if(tzy>=x) find(tr[now].l,tr[last].l,l,mid,x); else find(tr[now].r,tr[last].r,mid+1,r,x-tzy); } int main() { scanf("%lld %lld",&n,&m); for(ll i=1;i<=n;i++) scanf("%lld %lld %lld",&x1[i],&x2[i],&s[i]); for(ll i=1;i<=m;i++) { scanf("%lld",&zd[i].pos); zd[i].ti=i; } sort(zd+1,zd+m+1,cmp); for(ll i=1;i<=m;i++) add(rt[i],rt[i-1],1,m,zd[i].ti); ll l,r,mid,no; for(ll i=1;i<=n;i++) { l=0,r=m; while(l<r) { mid=(l+r+1)/2; if(zd[mid].pos<=x2[i]) l=mid; else r=mid-1; } no=l; l=0,r=m; while(l<r) { mid=(l+r+1)/2; if(zd[mid].pos>=x1[i]) r=mid-1; else l=mid; } find(rt[no],rt[l],1,m,s[i]); } for(ll i=1;i<=m;i++) printf("%lld\n",ans[i]); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现