UVA12299 线段树水水水,但别乱开空间= =

本文通过实战案例介绍线段树的构建、查询及更新操作,并分享调试过程中的注意事项,如非递归写法练习及区间修改实现等。

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

题目

看lyc的题解。。。。
传送门
果然神的题解都不放代码的

但是一直不知道为什么错了。。。后来也不知道怎么改就过了。。。。
后来慢慢改,也不知道怎么就ac了。。。
看来敲线段树还是要仔细啊。啊啊啊啊啊啊啊啊啊啊啊啊啊

单点修改,区间查询,练练非递归写法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=433333,INF=99999999; 

struct tree{
    int T[N],BTM;

    void build(int n){
        BTM=1; while (BTM<n)BTM<<=1; BTM--;//getBTM
        for (int i=BTM+1;i<=BTM+n;i++)scanf("%d",&T[i]);
        scanf("\n");
        for (int i=BTM+n+1;i<=BTM*2+1;i++)T[i]=INF;
        for (int i=BTM;i>=1;i--){
            T[i]=min(T[i<<1],T[i<<1^1]);
        }
    }

    int query(int l,int r){
        int ans=INF;
        for (l+=BTM-1,r+=BTM+1;l^r^1;l>>=1,r>>=1){
            if (~l&1)ans=min(ans,T[l^1]);
            if ( r&1)ans=min(ans,T[r^1]);
        }
        return ans;
    }

    void change(int k,int x){
        for (T[k+=BTM]=x,k>>=1;k;k>>=1){
            T[k]=min(T[k<<1],T[k<<1^1]);
        }
    }
}T;

int main(){
    int x,y,n,q;
    //freopen("fuck.in","r",stdin);
    scanf("%d%d",&n,&q);
    T.build(n);

    char ch,ch2,ask;
    while (q--){
        scanf("%c",&ask);
        for (int i=1;i<=5;i++)scanf("%c",&ch);
        if (ask=='q'){
            scanf("%d%c%d%c",&x,&ch,&y,&ch2);
            printf("%d\n",T.query(x,y));
        }else {
            scanf("%d%c",&x,&ch);
            int tmp=T.T[x+T.BTM];
            while (~scanf("%d%c",&y,&ch)){
                T.change(x,T.T[y+T.BTM]);
                x=y; if (ch==')')break;
            }
            T.change(y,tmp);
        }
        getchar();
    }
    return 0;
} 

有没有神犇求教区间修改的非递归写法,,,傻傻看不懂

感谢【爱晒妹的静静】帮我普及基本法
这里写图片描述

啊啊啊啊啊
一开始数组开20W,然后RTE,
一怒之下开200W,,,SE
最后改成40W,,,,,A了,,
十分的狗屁不通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值