Codeforces 1221F. Choose a Square

本文探讨了一个特定的二维偏序问题,通过将点$(x,y)$映射到另一平面上,利用线段树进行优化,解决了在特定条件下求点的价值和问题。通过按$x$从大到小,$y$从小到大排序,维护线段树表示当前$x$情况下$y$取各值时能获得的最大价值,实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

对于某个点 $(x,y)$ ,不妨设 $x<y$ 因为如果 $x>y$ 直接按 $y=x$ 对称一下即可

当且仅当正方形左下角 $(a,a)$ 满足 $a<=x$,右上角 $(b,b)$ 满足 $b>=y$ ,才能得到这个点的价值

所以发现其实是个二维偏序的问题,直接把 $(a,b)$ 看成另一个平面上的点,$(x,y)$ 放到那个平面上

这样就问题变成选一个点 $(a,b)$ ,你得到的价值为所有 $x>=a$ 并且 $y<=b$ 的点 $(x,y)$ 的价值和再减去 $a,b$ 之间的差值

考虑把点按第一关键字 $x$ 从大到小,按第二关键字 $y$ 从小到大排序,维护一个线段树表示当前 $a=x$ 的情况下 $y$ 取各个值时能够得到的最大价值

因为当前 $a=x$ 的情况下,所有 $x>a$ 的点的代价都加入了,每次加入一个点以后直接查询线段树上 $b>=y$ 和下一个点 $b<=y'-1$ 之间的那一段的最大价值,当然如果下一个点的 $x$ 和当前点不同,那么查询直接查询当前点到线段树最大位置的值即可

发现这样是有问题的,因为对于不同的 $b=y$ ,直接取点的值最大还不行,因为代价还要考虑 $-(y-x)$,所以线段树上维护的应该是点值和再减 $y$ 以后的最大值,当然要随便维护一下取最大值时 $b$ 的值

然后就没了,代码因为主体是比赛时写的,可能比较丑,但是还能看...吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=1e6+7;
const ll INF=1e18;
int n,x[N],y[N],c[N],t[N],xx[N],yy[N];
struct dat {
    int l,r,val,id;
    dat (int _l=0,int _r=0,int _val=0,int _id=0) { l=_l,r=_r,val=_val,id=_id; }
    inline bool operator < (const dat &tmp) const {
        if(l!=tmp.l) return l>tmp.l;
        return r!=tmp.r ? r<tmp.r : val>tmp.val;
    }
}d[N];
int tot;
int inv[N];
struct SegTree {
    ll T[N<<2],id[N<<2],tag[N<<2];
    inline void pushup(int o) { T[o]=max(T[o<<1],T[o<<1|1]); id[o]=T[o<<1]>=T[o<<1|1] ? id[o<<1] : id[o<<1|1]; }
    inline void pushdown(int o,int l,int r)
    {
        if(!o||!tag[o]) return;
        T[o]+=tag[o]; if(l==r) { tag[o]=0; return; }
        tag[o<<1]+=tag[o]; tag[o<<1|1]+=tag[o];
        tag[o]=0;
    }
    void build(int o,int l,int r)
    {
        if(l==r) { id[o]=l; T[o]=-inv[l]; return; }
        int mid=l+r>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r);
        pushup(o);
    }
    inline void change(int o,int l,int r,int ql,int qr,int v)
    {
        pushdown(o,l,r);
        if(l>qr||r<ql) return;
        if(l>=ql&&r<=qr) { tag[o]=v; pushdown(o,l,r); return; }
        int mid=l+r>>1;
        change(o<<1,l,mid,ql,qr,v); change(o<<1|1,mid+1,r,ql,qr,v);
        pushup(o);
    }
    ll pos,val;
    inline void query(int o,int l,int r,int ql,int qr)
    {
        pushdown(o,l,r);
        if(l>qr||r<ql) return;
        if(l>=ql&&r<=qr) { if(T[o]>val) val=T[o],pos=id[o]; return; }
        int mid=l+r>>1; query(o<<1,l,mid,ql,qr); query(o<<1|1,mid+1,r,ql,qr);
        pushup(o);
    }
}ST;
int main()
{
    n=read();
    for(int i=1;i<=n;i++) xx[i]=x[i]=read(),yy[i]=y[i]=read(),c[i]=read();
    for(int i=1;i<=n;i++) t[++tot]=x[i],t[++tot]=y[i];
    sort(t+1,t+tot+1); tot=unique(t+1,t+tot+1)-t-1;
    for(int i=1;i<=n;i++) x[i]=lower_bound(t+1,t+tot+1,x[i])-t;
    for(int i=1;i<=n;i++) y[i]=lower_bound(t+1,t+tot+1,y[i])-t;
    int ansx=0,ansy=0;
    for(int i=1;i<=n;i++)
    {
        if(x[i]>y[i]) swap(x[i],y[i]),swap(xx[i],yy[i]);
        d[i]=dat(x[i],y[i],c[i],i);
        ansx=max(ansx,yy[i]+1); ansy=max(ansy,yy[i]+1);
        inv[x[i]]=xx[i]; inv[y[i]]=yy[i];
    }
    sort(d+1,d+n+1); ll ans=0; ST.build(1,1,tot);
    d[n+1].l=-233;
    for(int i=1;i<=n;i++)
    {
        ST.change(1,1,tot,d[i].r,tot,d[i].val);
        ST.val=-INF; ST.pos=0;
        if(d[i].l==d[i+1].l) ST.query(1,1,tot,d[i].r,d[i+1].r-1);
        else ST.query(1,1,tot,d[i].r,tot);
        ll res=ST.val+inv[d[i].l];
        if(res>ans) ans=res,ansx=inv[d[i].l],ansy=inv[ST.pos];
    }
    printf("%lld\n",ans);
    printf("%d %d %d %d\n",ansx,ansx,ansy,ansy);
    return 0;
}

 

转载于:https://www.cnblogs.com/LLTYYC/p/11556948.html

内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值