SPOJ GSS1 [线段树]

来源:互联网 发布:淘宝怎么设置起拍数量 编辑:程序博客网 时间:2024/05/29 21:28

Can you answer these queries I

题目连接

题解

普普通通的线段树区间合并,维护左、右、本身的值即可

#include <iostream>  #include <cstdio>  #include <algorithm>  #define INF 0x3f3f3f3f  using namespace std;  struct node{      int sum,mx,lx,rx;    node(int x = 0){          sum = mx = lx = rx = x;     }  }tree[1000001];  int ql,qr;  node update(node x, node y){           node ans;      ans.sum = x.sum + y.sum;              ans.mx = max(x.rx + y.lx, max(x.mx, y.mx));      ans.lx = max(x.lx, x.sum + y.lx);     ans.rx = max(y.rx, y.sum + x.rx);    return ans;  }  void build(int num,int l,int r){      if(l == r){          int x;          scanf("%d",&x);          tree[num] = node(x);          return ;      }      int mid = (l+r)>> 1;      build(num*2,l,mid);      build(num*2+1,mid+1,r);      tree[num] = update(tree[num*2], tree[num*2+1]);  }  node query(int num,int l,int r){      if(ql <= l && r <= qr)  return tree[num];      node x(-INF), y(-INF);      x.sum=y.sum=0;    int mid = (l+r)>> 1;      if (ql <= mid)  x = query(num*2,l,mid);      if (qr > mid)   y = query(num*2+1,mid+1,r);     return update(x,y);  }  int main(){      int n,m;      while(scanf("%d", &n)!=EOF){          build(1,1,n);          scanf("%d",&m);          while(m--){              scanf("%d%d",&ql,&qr);              printf("%d\n", query(1,1,n).mx);          }      }      return 0;  }
原创粉丝点击