本人刚学线段树,40分求调!悬赏关注

P2880 [USACO07JAN] Balanced Lineup G

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


|