线段树加了快读还是 TLE 一个点求助
查看原帖
线段树加了快读还是 TLE 一个点求助
220824
yyz1005楼主2022/7/24 14:33

#11 859ms TLE

code:

#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
const int N = 100010;
int ans[N<<2],lazy[N<<2];
int a[N],n;
void push_up(int id,int l,int r){
    ans[id] = max(ans[ls(id)],ans[rs(id)]);
}
void tag_down(int id,int l,int r,int x){
    lazy[id]+=x;
    ans[id]+=x;
}
void push_down(int id,int l,int r){
    int mid = (l+r)>>1;
    tag_down(ls(id),l,mid,lazy[id]);
    tag_down(rs(id),mid+1,r,lazy[id]);
    lazy[id] = 0;
}
void build(int id,int l,int r){
    if(l==r){
        ans[id] = a[l];
        return;
    }
    int mid = (l+r)>>1;
    build(ls(id),l,mid);
    build(rs(id),mid+1,r);
    push_up(id,l,r);
}
void update(int id,int l,int r,int ql,int qr,int x){
	//printf("[%d](%d---%d)\n",id,l,r);
    if(ql<=l&&r<=qr){
        lazy[id]+=x;
        ans[id]+=x;
        return;
    }
    push_down(id,l,r);
    int mid = (l+r)>>1;
    if(ql<=mid) update(ls(id),l,mid,ql,qr,x);
    if(qr>mid) update(rs(id),mid+1,r,ql,qr,x);
    push_up(id,l,r);
}
int query(int id,int l,int r,int ql,int qr){
	//printf("[%d=%d=](%d---%d)[%d---%d]\n",id,ans[id],l,r,ql,qr);
    if(ql<=l&&r<=qr) return ans[id];
    int mid = (l+r)>>1;
    push_down(id,l,r);
    if((ql<=mid)&&(qr>mid)) return max(query(ls(id),l,mid,ql,qr),query(rs(id),mid+1,r,ql,qr));
    if(ql<=mid) return query(ls(id),l,mid,ql,qr);
    return query(rs(id),mid+1,r,ql,qr);
}
int q;
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*10+ch-48;ch=getchar();}
	return x*f;
}
int main(){
    n = read(),q = read();
    for(int i = 1; i <= n; i++) a[i] = read();
    build(1,1,n);
    while(q--){
        int lef,rig;
        lef = read(),rig = read();
        printf("%d\n",query(1,1,n,lef,rig));
    }
    return 0;
}
2022/7/24 14:33
加载中...