樹狀陣列玄學遞推求最值
阿新 • • 發佈:2020-08-01
為了卡常費盡心機
全加register+inline
最後卡掉一個點,,其他的快到飛起
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; int n,q; int tmax[maxn],a[maxn]; inline int mxx(register int x,register int y){ return x>y ? x : y; } inline int read() { int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') {if(ch == '-') w = -1; ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; } void print(register int x) { if(x < 0) {putchar('-'); x =- x;} if(x > 9) print(x / 10); putchar(x % 10 + '0'); } inline int lowbit(register int x){ return x & -x; } inline void add(register int i,register int d){ for(;i<=n;i+=lowbit(i)) tmax[i]=tmax[i] > d ? tmax[i] : d; } inline int find_max(register int l,register int r){ if(r>l){ if(r-lowbit(r) > l) return mxx(find_max(l,r-lowbit(r)),tmax[r]); else return mxx(find_max(l,r-1),a[r]); } return a[l]; } int main (){ scanf("%d%d",&n,&q); for(register int i=1;i<=n;i++){ a[i]=read(); add(i,a[i]); } for(register int j=1;j<=q;j++){ int l,r; l=read(); r=read(); print(find_max(l,r)); printf("\n"); } return 0; }
然後就換成了玄學遞推 秒過
%%%KKarshilov dalao
#include <stdio.h> #include <string.h> #include <algorithm> #define maxn 1e9 #define Max(a,b) ((a)>(b)?(a):(b)) #define lowbit(x) (x&-x) int tre[1000000],n,cnt,temp,m,a[1000000]; inline int read() { int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') {if(ch == '-') w = -1; ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; } inline void add_tre(int x) { int low, i; while (x<=n) { tre[x]=a[x]; low=lowbit(x); for (i=1;i<low;i<<=1) tre[x]=Max(tre[x],tre[x-i]); x+=lowbit(x); } } int query(int x, int y) { int ans=0; while (y>=x) { ans=Max(a[y], ans); y--; while(y-lowbit(y)>=x) { ans=Max(tre[y],ans); y-=lowbit(y); } } return ans; } int main() { n=read();m=read(); for(int i=1;i<=n;i++) { a[i]=read(); add_tre(i); } for(int i=1,x,y;i<=m;i++) { x=read();y=read(); printf("%d\n",query(x,y)); } return 0; }
感謝gyz dalao和我們一起卡嘶