线段树tle7个点??求助大佬们

P3865 【模板】ST 表

# 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1)
by SSerxhs @ 2019-04-13 21:31:23


@[SSerxhs](/space/show?uid=29826) 题解的线段树可以A啊..比如这篇 ```cpp #include<iostream> #include<cstdio> #include<cstring> #define maxn 8000001 #define re register #define FOR(i,l,r) for(re int i=l;i<=r;i++) using namespace std; int a[maxn],b[maxn],ans[maxn],tag[maxn],m,n,maxx,minn,c,t,x,y; inline int in(){ char ch; int a=0,w=1; while(!(((ch=getchar())>='0')&&(ch<='9'))); a*=10;a+=ch-'0'; while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0'; return a*w; } inline void out(int a){ if(a>=10)out(a/10); putchar(a%10+'0'); } inline int ls(int k){ return k<<1; } inline int rs(int k){ return k<<1|1; } inline void push_up(int k){ ans[k]=max(ans[ls(k)],ans[rs(k)]); } void build(int p,int l,int r){ if(l==r){ ans[p]=a[l]; return; } int mid=(l+r)>>1; build(ls(p),l,mid); build(rs(p),mid+1,r); push_up(p); } int query(int q_x,int q_y,int l,int r,int p){ int res=0; if(q_x<=l&&r<=q_y) return ans[p]; int mid=(l+r)>>1; if(q_x<=mid) res=max(res,query(q_x,q_y,l,mid,ls(p))); if(q_y>mid) res=max(res,query(q_x,q_y,mid+1,r,rs(p))); return res; } int main(){ n=in(),m=in(); FOR(i,1,n) a[i]=in(); build(1,1,n); FOR(i,1,m){ x=in(),y=in(); out(query(x,y,1,n,1)); puts(""); } } ```
by RoRoyyy @ 2019-04-13 21:32:39


我觉得可能是玄学问题 我的远古代码 ~~~cpp #include<iostream> #include<cstdio> using namespace std; struct shu { int l,r,s; }a[8000004]; int shu(int l,int r,int k) { a[k].l=l; a[k].r=r; if(l==r)cin>>a[k].s; else a[k].s=max(shu((l+r)/2+1,r,k*2+1),shu(l,(l+r)/2,k*2)); return a[k].s; } int findmax(int l,int r,int k) { if(a[k].l>r||a[k].r<l)return -2147482647; if(a[k].l>=l&&a[k].r<=r)return a[k].s; return max(findmax(l,r,2*k),findmax(l,r,2*k+1)); } int main() { int n,m,ll,rr; scanf("%d%d",&n,&m); shu(1,n,1); for(int i=1;i<=m;i++) { scanf("%d%d",&ll,&rr); printf("%d\n",findmax(ll,rr,1)); } return 0; //system("pause"); return 0; } ~~~cpp
by ttklwxx @ 2019-04-13 21:36:10


@[董鲤鱼烧](/space/show?uid=65309) 我的没错吧..
by RoRoyyy @ 2019-04-13 21:38:30


~~俗话说得好:人丑常数大~~
by hyfhaha @ 2019-04-13 21:53:18


emmm蒟蒻才交的,时间最大单点400ms+ ```cpp #include<bits/stdc++.h> namespace IO{ //#define R register #define num (ch-'0') template<typename T>inline void read(T& res){ char ch;bool flag=false; while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true); for(res=num;isdigit(ch=getchar());res=res*10+num); (flag)&&(res=-res); } template<typename T>inline void print(T x){ if(x<0) putchar('-'),x=-x; if(x>9) print(x/10); putchar(x%10+'0'); } template<typename T>inline T min(T a,T b){ return a >= b ? b : a; } template<typename T>inline T max(T a,T b){ return a >= b ? a : b; } } using namespace IO; using namespace std; typedef long long LL; #define Mid(l,r) ((l+r)>>1) #define ls(x) (x<<1) #define rs(x) (x<<1|1) const LL maxn=100010; LL n,m,a[maxn],ans[maxn<<2],lazy[maxn<<2],maxx[maxn<<2],cnt; inline void build(LL p,LL l,LL r){ if(l==r){ans[p]=a[l],maxx[p]=a[++cnt];return;} LL mid=Mid(l,r); build(ls(p),l,mid); build(rs(p),mid+1,r); maxx[p]=IO::max(maxx[ls(p)],maxx[rs(p)]); } inline LL get_max(LL p,LL l,LL r,LL nl,LL nr){ LL re=-0x3f3f3f3f; if(nl<=l&&r<=nr) re=maxx[p]; else{ LL m=Mid(l,r); if(nl<=m) re=IO::max(re,get_max(ls(p),l,m,nl,nr)); if(nr>m) re=IO::max(re,get_max(rs(p),m+1,r,nl,nr)); } return re; } signed main(){ read(n),read(m); for(LL i=1;i<=n;i++) read(a[i]); build(1,1,n); while(m--){ LL l,r; read(l),read(r); print(get_max(1,1,n,l,r)),putchar('\n'); } return 0; } ```
by c20191623 @ 2019-05-07 18:22:59


这题卡cin、cout(都改scanf/printf才有用)
by 蒟蒻lxy @ 2019-07-01 23:00:24


|