本文共 2381 字,大约阅读时间需要 7 分钟。
#include #include #include #include #include #include #include #include #include #include using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int maxnum=50000; int h[maxnum+5],l[200000+5],r[200000+5]; struct Node{ int minn; int maxn; }node[4*maxnum+5]; int min(int a,int b) { return a b?a:b; } void add(int a,int b,int v,int k,int l,int r) { if(l>=a&&r<=b) { node[k].minn=v; node[k].maxn=v; } else if(r>a&&l >1); add(a,b,v,2*k+2,(l+r)>>1,r); node[k].maxn=max(node[2*k+1].maxn,node[2*k+2].maxn); node[k].minn=min(node[2*k+1].minn,node[2*k+2].minn); } }//挑战的风格,将建树与区间更新合为一个函数 int hmax(int a,int b,int k,int l,int r) { if(a<=l&&r<=b) return node[k].maxn; else if(r>a&&l >1); int tempr=hmax(a,b,2*k+2,(l+r)>>1,r); return templ>tempr?templ:tempr; } else return 0; }//区间查询 int hmin(int a,int b,int k,int l,int r) { if(a<=l&&r<=b) return node[k].minn; else if(r>a&&l >1); int tempr=hmin(a,b,2*k+2,(l+r)>>1,r); return templ
#include #include #include #include #include #include #include #include #include #include using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int maxnum=50000; int h[maxnum+5],l[200000+5],r[200000+5]; struct Node{ int minn; int maxn; }node[4*maxnum+5]; int min(int a,int b) { return a b?a:b; } void build(int k,int l,int r) { if(r-l==1) { scanf("%d",&node[k].maxn); node[k].minn=node[k].maxn; return; } build(2*k+1,l,(l+r)>>1); build(2*k+2,(l+r)>>1,r); node[k].maxn=max(node[2*k+1].maxn,node[2*k+2].maxn); node[k].minn=min(node[2*k+1].minn,node[2*k+2].minn); } int hmax(int a,int b,int k,int l,int r) { if(a<=l&&r<=b) return node[k].maxn; else if(r>a&&l >1); int tempr=hmax(a,b,2*k+2,(l+r)>>1,r); return templ>tempr?templ:tempr; } else return 0; } int hmin(int a,int b,int k,int l,int r) { if(a<=l&&r<=b) return node[k].minn; else if(r>a&&l >1); int tempr=hmin(a,b,2*k+2,(l+r)>>1,r); return templ
转载地址:http://lvgsi.baihongyu.com/