SPOJ 1043 Can you answer these queries I

来源:互联网 发布:uv淘宝论坛 编辑:程序博客网 时间:2024/06/11 23:00

需要维护的是最大和只能是 max(max(Nodes[now<<1],Nodes[now<<1|1],Nodes[now].rmax+Nodes[now<<1|1].lmax)

所以我们要维护的是lmax,rmax,max,sum四个信息

#include <iostream>#include <cstring>#include <cstdlib>#include <algorithm>#include <cmath>using namespace std;#define LL long long#define Now int now,int l,int r#define Mid int mid = (l+r)>>1#define lson now<<1,l,mid#define rson now<<1|1,mid+1,r#define root 1,1,Nconst int INF = 0x3f3f3f3f;const int maxn = 50000+10;struct Info{int lmax,rmax,sum,value;Info(){lmax = rmax = value = -INF;sum = 0;}void maintain(int x){lmax = rmax = sum = value = x;}};Info operator + (const Info & a,const Info & b){Info ret;ret.lmax = max(a.lmax,a.sum+b.lmax);ret.rmax = max(b.rmax,a.rmax+b.sum);ret.sum = a.sum+b.sum;ret.value = max(max(a.value,b.value),a.rmax+b.lmax);return ret;}Info Nodes[maxn<<2];void update(Now,int pos,int val){if(l == r){Nodes[now].maintain(val);return;}Mid;if(pos <= mid)update(lson,pos,val);elseupdate(rson,pos,val);Nodes[now] = Nodes[now<<1]+Nodes[now<<1|1];}Info query(Now,int ql,int qr){Info ret;if(ql <= l && r <= qr){return Nodes[now];}Mid;if(ql <= mid)ret = ret + query(lson,ql,qr);if(qr > mid)ret = ret + query(rson,ql,qr);return ret;}int main(){ios::sync_with_stdio(false);int N,M,x,ql,qr;while(cin>>N){for(int i = 1; i <= N; i++){cin>>x;update(root,i,x);}cin>>M;while(M--){cin>>ql>>qr;cout<<query(root,ql,qr).value<<endl;}}return 0;}


原创粉丝点击