T飞了
by Ferdina_zcjb @ 2023-06-14 16:50:30
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define N 50001
#define TN 200010
int n,q,x,y,h[N],ans1,ans2,tree[TN],tree2[TN];
namespace FastIO
{
template<typename T=int> inline T read()
{
T s=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
return s*w;
}
template<typename T> inline void read(T &s)
{
s=0; int w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
s=s*w;
}
template<typename T,typename... Args> inline void read(T &x,Args &...args)
{
read(x),read(args...);
}
template<typename T> inline void write(T x,char ch)
{
if(x<0) x=-x,putchar('-');
static char stk[25]; int top=0;
do {stk[top++]=x%10+'0',x/=10;} while(x);
while(top) putchar(stk[--top]);
putchar(ch);
return;
}
}
using namespace FastIO;
void build(int k,int L,int R){
if(L == R){
tree[k] = tree2[k] = read();
return ;
}
int mid = (L+R)>>1;
build(k<<1,L,mid);
build(k<<1|1,mid+1,R);
tree[k] = max(tree[k<<1],tree[k<<1|1]);
tree2[k] = min(tree2[k<<1],tree2[k<<1|1]);
}
void ask(int k,int L,int R,int l,int r){
if(L <= l && r <= R){
ans1 = max(ans1,tree[k]);
ans2 = min(ans2,tree2[k]);
return;
}
int mid=(l+r)>>1;
if(L <= mid) ask(k<<1,L,R,l,mid);
if(R > mid) ask(k<<1|1,L,R,mid+1,r);
}
signed main(){
read(n,q);
build(1,1,n);
for(int i = 1;i <= q;++i){
read(x,y);
ans1 = 0;
ans2 = 0x7fffffff;
ask(1,x,y,1,n);
write(ans1-ans2,'\n');
}
}
```
by LgxTpre @ 2023-06-14 16:57:06
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define N 50001
#define TN 210000
int n,q,h[N],tree[TN],tree2[TN];
struct node{
int ans1,ans2;
}tem;
int read() {
int s = 0, f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
return f ? -s : s;
}
void build(int k,int L,int R){
if(L == R){
//cout << 0 << endl;
tree[k] = tree2[k] = read();
return ;
}
int mid = (L+R)>>1;
build(k<<1,L,mid);
build(k<<1|1,mid+1,R);
tree[k] = max(tree[k<<1],tree[k<<1|1]);
tree2[k] = min(tree2[k<<1],tree2[k<<1|1]);
}
node ask(int k,int L,int R,int l,int r){
if(L > r || R < l)return {-0x3f3f3f3f,0x3f3f3f3f};
if(L <= l && R >= r){
//cout << tree[k].Max <<" "<<tree[k].Min << endl;
return {tree[k],tree2[k]};
// ans1 = max(ans1,tree[k]);
// ans2 = min(ans2,tree2[k]);
}
// if(l == r)return ;
int mid = (l+r)>>1;
// ask(k<<1,L,R,l,mid);
// ask(k<<1|1,L,R,mid+1,r);
node tem1=ask(k<<1,L,R,l,mid),tem2=ask(k<<1|1,L,R,mid+1,r);
return{max(tem1.ans1,tem2.ans1),min(tem1.ans2,tem2.ans2)};
}
signed main(){
cin >> n >> q;
build(1,1,n);
for(int i = 1;i <= q;++i){
int x,y;
cin >> x >> y;
// ans1 = 0;
// ans2 = 0x7fffffff;
tem=ask(1,x,y,1,n);
cout <<tem.ans1-tem.ans2<< endl;
}
}
```
by Pursuing_OIer @ 2023-06-14 16:57:43
1.线段树开4倍空间
2.递归慎用全局变量
by Pursuing_OIer @ 2023-06-14 16:58:39
@[Pursuing_OIer](/user/752591)
@[LgxTpre](/user/66709)
谢谢,已关
by Ferdina_zcjb @ 2023-06-14 16:59:34
@[Pursuing_OIer](/user/752591) 为啥不能用全局变量,他这个不是边界问题么
by LgxTpre @ 2023-06-14 16:59:35
在进行下一级递归时会破环上一级递归的结果
(这篇代码可能没有此问题,但这真不是一个好习惯)
by Pursuing_OIer @ 2023-06-14 17:02:53
@[Pursuing_OIer](/user/752591) @[LgxTpre](/user/66709)
是的,有时为了追求写码速度,会频繁使用不规范的全局变量。
by Ferdina_zcjb @ 2023-06-14 17:05:08
@[Pursuing_OIer](/user/752591) 哦,谢谢指导
by LgxTpre @ 2023-06-14 17:07:34
%%%
by Pursuing_OIer @ 2023-06-14 17:08:54