gym 101879G Running a penitentiary(线段树)

题目链接:http://codeforces.com/gym/101879/problem/G

题意:有n个警察,第i个警察看管监狱的区间是【Li,Ri】。
有两种操作:C i l r :把第i个警察的区间变为【l,r】。
?l r :询问从第l个警察到第r个警察共同看管的区间长度是多少

我的思路:以警察来建线段树,每次维护一个区间里最大的l和最小的r,这样很容易得到这个区间里的警察的公共区间的长度就是r-l+1。最后就变成了单点更新+区间询问的线段树。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+3;
#define lson rt<<1
#define rson rt<<1|1
ll xl[maxn],xr[maxn];
struct node//个人觉得用结构体会简便一点
{
    ll l,r,len;
}tree[maxn<<2];
int cnt;

void bulid(ll rt,ll l,ll r)
{
    if(l==r)
    {
        tree[rt].l=xl[++cnt];
        tree[rt].r=xr[cnt];
        tree[rt].len=xr[cnt]-xl[cnt]+1;
        return;
    }
    ll mid=(l+r)>>1;
    bulid(lson,l,mid);
    bulid(rson,mid+1,r);
    tree[rt].l=max(tree[lson].l,tree[rson].l);//向上更新
    tree[rt].r=min(tree[lson].r,tree[rson].r);
    tree[rt].len=tree[rt].r-tree[rt].l+1;
}

void updata(ll rt,ll l,ll r,ll x,ll newl,ll newr)
{
    if(l==x&&r==x)
    {
        tree[rt].l=newl;
        tree[rt].r=newr;
        tree[rt].len=tree[rt].r-tree[rt].l+1;
        return;
    }
    ll mid=(l+r)>>1;
    if(x<=mid)updata(lson,l,mid,x,newl,newr);
    else updata(rson,mid+1,r,x,newl,newr);
    tree[rt].l=max(tree[lson].l,tree[rson].l);//向上更新
    tree[rt].r=min(tree[lson].r,tree[rson].r);
    tree[rt].len=tree[rt].r-tree[rt].l+1;
}

node query(ll rt,ll l,ll r,ll x,ll y)
{
    if(l>=x&&r<=y)
    {
        return tree[rt];
    }
    ll mid=(l+r)>>1;
    node a,b,c;
    bool ff=false;
    if(y<=mid)a=query(lson,l,mid,x,y);
    else if(x>=mid+1)a=query(rson,mid+1,r,x,y);
    else a=query(lson,l,mid,x,mid),b=query(rson,mid+1,r,mid+1,y),ff=true;
    if(ff)//如果是左右两个子树都有的话,就要重新更新最大的l和最小的r
    {
        c.l=max(a.l,b.l);
        c.r=min(a.r,b.r);
        c.len=c.r-c.l+1;
        return c;
    }
    else return a;
}

int main()
{
    int n,q;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)scanf("%lld%lld",&xl[i],&xr[i]);
    cnt=0;
    bulid(1,1,n);
    char o[2];
    int tp1,tp2,tp3;
    for(int i=1;i<=q;i++)
    {
        scanf("%s",o);
        if(o[0]=='?')
        {
            scanf("%d%d",&tp1,&tp2);
            node ans=query(1,1,n,tp1,tp2);
            printf("%lld\n",ans.len>=0?ans.len:0);//如果一个区间的长度是负的,也就是没有公共区间
        }
        else
        {
            scanf("%d%d%d",&tp1,&tp2,&tp3);
            updata(1,1,n,tp1,tp2,tp3);
        }
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自2020年以来,自动驾驶汽车(Autonomous Vehicle)在这一领域取得了显著进展。 自动驾驶汽车通过使用先进的传感技术,如雷达、激光雷达和摄像头,以及深度学习和人工智能算法,实现了车辆的自主驾驶。它们能够感知周围环境,了解道路状况,并做出相应的决策和行驶动作,从而实现无需人类操控的车辆行驶。 自动驾驶汽车在2020年迅速崭露头角。它们的技术日益成熟,不断的实验和测试表明其在安全性和性能方面已经取得了显著的突破。虽然仍然存在一些挑战,比如在复杂城市环境中导航和处理紧急情况,但这些问题正经过不断的研究和改进来得以解决。 在未来,自动驾驶汽车有望在各个领域发挥重要作用。首先,它们将可以提高道路交通的安全性。由于自动驾驶车辆不受人类司机的疲劳、分心和驾驶误差的限制,它们的驾驶能力更为稳定和准确。其次,自动驾驶汽车还能够提高交通效率。通过与其他车辆实时通信和协同,它们可以避免交通堵塞和减少事故发生,从而减少交通拥堵和行车时间成本。 此外,自动驾驶汽车也将为交通出行带来便利和舒适性。乘客可以更轻松地进行其他活动,如工作、休息或娱乐,而不必担心驾驶问题。老年人和残障人士也将能够自由独立地出行,提高他们的生活质量。 综上所述,作为2020年的重要趋势,自动驾驶汽车具有广阔的应用前景。通过不断的创新和发展,它们将在道路交通安全、交通效率和出行体验方面取得进一步的提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值