暑假题目记录

P1502 窗口的星星

自然转化为平面上有若干个矩形,每个矩形都带有一个权值,求在哪个坐标上权值的总和最大。

然后扫描线做掉一个维度,剩下的就是区间加全局最大值

复制代码
#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;
}
复制代码

 

posted @   Hanghang007  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示