暑假题目记录
自然转化为平面上有若干个矩形,每个矩形都带有一个权值,求在哪个坐标上权值的总和最大。
然后扫描线做掉一个维度,剩下的就是区间加全局最大值
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+3; int n,W,H,tree[N],tag[N]; map<int,int>mp; struct Nod{int x,l,r,val;}a[N]; bool Cmp(Nod a,Nod b){return a.x!=b.x?a.x<b.x:a.val>b.val;} #define ls (p<<1) #define rs (p<<1|1) #define mi ((l+r)>>1) void Add(int p,int d){tree[p]+=d;tag[p]+=d;} void Update(int L,int R,int p,int l,int r,int d) { if(L<=l&&r<=R){Add(p,d);return;} Add(ls,tag[p]);Add(rs,tag[p]);tag[p]=0; if(L<=mi)Update(L,R,ls,l,mi,d); if(R>mi)Update(L,R,rs,mi+1,r,d); tree[p]=max(tree[ls],tree[rs]); } void Solve() { cin>>n>>W>>H;int tot=0;mp.clear(); memset(tree,0,sizeof(0)); memset(tag,0,sizeof(0)); for(int i=1;i<=n;i++) { cin>>a[i].x>>a[i].l>>a[i].val;a[i].r=a[i].l+H-1; a[i+n]=a[i];a[i+n].x=a[i].x+W-1;a[i+n].val=-a[i].val; mp[a[i].l]=mp[a[i].r]=1; } n*=2;sort(a+1,a+n+1,Cmp);int ans=0; for(auto &p:mp)p.second=++tot; for(int i=1;i<=n;i++) { Update(mp[a[i].l],mp[a[i].r],1,1,tot,a[i].val); ans=max(ans,tree[1]); } cout<<ans<<endl; } int main() { int T;cin>>T; while(T--)Solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现