1. 程式人生 > 實用技巧 >樹狀陣列玄學遞推求最值

樹狀陣列玄學遞推求最值

Luogu P3865 【模板】ST表

為了卡常費盡心機
全加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和我們一起卡嘶