暑假题目记录
自然转化为平面上有若干个矩形,每个矩形都带有一个权值,求在哪个坐标上权值的总和最大。
然后扫描线做掉一个维度,剩下的就是区间加全局最大值
#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; }

浙公网安备 33010602011771号