1. 程式人生 > 其它 >Balanced Lineup poj 3264

Balanced Lineup poj 3264

也可以用st表做

但st表不支援動態更新

資料結構碼得還是太少,本廢物給您表演一個花式手抖

資料大注意scanf;

---

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
int maxn[200007],minn[200007]; void update(int root,int v,int p,int l,int r) { if(l==r) { maxn[root]=max(maxn[root],v); minn[root]=min(minn[root],v); return ; } int mid=(l+r)>>1; if(p<=mid) { update(root<<1,v,p,l,mid); }
if(p>mid) { update(root*2+1,v,p,mid+1,r); } maxn[root]=max(maxn[root<<1],maxn[root*2+1]); minn[root]=min(minn[root<<1],minn[root*2+1]); } int query1(int root,int l,int r,int ql,int qr) { // if(l==r) return maxn[root]; if(l>qr||r<ql) return 0;
if(l>=ql&&r<=qr) { return maxn[root]; } int mid=(l+r)>>1,ans=-1; if(ql<=mid) { ans=max(ans,query1(root<<1,l,mid,ql,qr)); } if(qr>mid) { ans=max(ans,query1(root*2+1,mid+1,r,ql,qr)); } return ans; } int query2(int root,int l,int r,int ql,int qr) { if(l>qr||r<ql) return (1<<27); if(l>=ql&&r<=qr) { return minn[root]; } int mid=(l+r)>>1,ans=1<<27; if(ql<=mid) { ans=min(ans,query2(root<<1,l,mid,ql,qr)); } if(qr>mid) { ans=min(ans,query2(root*2+1,mid+1,r,ql,qr)); } return ans; } int main() { // freopen("lys.in","r",stdin); memset(maxn,0,sizeof(maxn)); memset(minn,0x3f,sizeof(minn)); int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { int a; scanf("%d",&a); update(1,a,i,1,n); } for(int i=1;i<=m;i++) { int ql,qr; scanf("%d%d",&ql,&qr); printf("%d\n",query1(1,1,n,ql,qr)-query2(1,1,n,ql,qr)); } }