社区讨论

数据过水,线段树AC

P3865【模板】ST 表 & RMQ 问题参与者 7已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@m2zfxuf5
此快照首次捕获于
2024/11/02 08:44
去年
此快照最后确认于
2025/11/04 23:39
4 个月前
查看原帖
借@cj1314的代码加了点优化
CPP
#include <bits/stdc++.h>
//#define int long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define rep(i,l,r) for(register int i(l);i<=r;++i)
#define per(i,r,l) for(register int i(r);i>=l;--i)
using namespace std;
int n,m,a[100005];
struct tree{
    int l,r,big;
}t[400005];
inline char gc()
{
    static char buf[1<<20], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<20, stdin), p1 == p2) ? EOF : *p1 ++;
}
inline void wr(int x) {
  static int sta[20];
  int top = 0;
  do {
    sta[top++] = x % 10, x /= 10;
  } while (x);
  while (top) putchar(sta[--top] + 48);
}
int read()
{
	int n = 0;
    bool w = 0;
    char c = gc();
    for(; c < 48 || c > 57; c = gc())
        w = c == 45;
    for(n = 0; c >= 48 && c <= 57; c = gc())
        n = (n<<3)+(n<<1) + (c ^ 48);
    n = w ? -n : n;
    return n;
}
inline void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].big=a[l];
        return;
    }
    int mid=l+r>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    t[p].big=max(t[ls(p)].big,t[rs(p)].big);
}
inline int ask(int p,int &l,int &r){
    if(t[p].r<l||t[p].l>r)return 0;
    if(t[p].l>=l&&t[p].r<=r)return t[p].big;
	int ret=0;
    ret=max(ret,ask(ls(p),l,r));
    ret=max(ret,ask(rs(p),l,r));
    return ret;
}
int main() {
    n=read(),m=read();
    rep(i,1,n)a[i]=read();
    build(1,1,n);
    rep(i,1,m){
        int l=read(),r=read();
        wr(ask(1,l,r));
        putchar('\n');
    }
	return 0;
}
极限764ms卡过 %%%%%%%%%

回复

11 条回复,欢迎继续交流。

正在加载回复...