无修改区间查询 BNU Can you answer these queries I

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4
  5 using namespace std;
  6
  7 int an[50010];
  8 int get[50010];
  9 struct Node
 10 {
 11     int l,r;
 12     int lmax,rmax,ma;
 13     int sum;
 14 }bn[200000];
 15
 16 void build(int k,int l,int r)
 17 {
 18     bn[k].l=l;
 19     bn[k].r=r;
 20     bn[k].sum=get[r]-get[l-1];
 21     if(l==r)
 22     {
 23         bn[k].ma=an[l];
 24         bn[k].lmax=an[l];
 25         bn[k].rmax=an[l];
 26         return ;
 27     }
 28     int lk=k*2;
 29     int rk=lk+1;
 30     int mid=(l+r)/2;
 31     build(lk,l,mid);
 32     build(rk,mid+1,r);
 33     bn[k].lmax=max(bn[lk].lmax,bn[lk].sum+bn[rk].lmax);
 34     bn[k].rmax=max(bn[rk].rmax,bn[rk].sum+bn[lk].rmax);
 35     bn[k].ma=max(bn[k].lmax,bn[k].rmax);
 36     bn[k].ma=max(bn[k].ma,bn[lk].ma);
 37     bn[k].ma=max(bn[k].ma,bn[rk].ma);
 38     bn[k].ma=max(bn[k].ma,bn[lk].rmax+bn[rk].lmax);
 39     bn[k].sum=bn[lk].sum+bn[rk].sum;
 40 }
 41
 42 Node search(int k,int l,int r)
 43 {
 44     if(bn[k].l==l&&bn[k].r==r)
 45     {
 46  //       cout<<"l"<<l<<"r"<<r<<endl;
 47  //       cout<<bn[k].ma<<" "<<bn[k].sum<<" "<<bn[k].lmax<<" "<<bn[k].rmax<<endl;
 48         return bn[k];
 49     }
 50     int lk=k*2;
 51     int rk=lk+1;
 52     if(bn[lk].r>=r)
 53     {
 54   //      cout<<"kk2"<<endl;
 55         return search(lk,l,r);
 56     }
 57     else if(bn[rk].l<=l)
 58     {
 59   //      cout<<"kk1"<<endl;
 60         return search(rk,l,r);
 61     }
 62     else
 63     {
 64  //       cout<<"kk"<<endl;
 65         Node a=search(lk,l,bn[lk].r);
 66         Node b=search(rk,bn[rk].l,r);
 67         Node ret;
 68         ret.sum=a.sum+b.sum;
 69         ret.lmax=max(a.lmax,a.sum+b.lmax);
 70         ret.rmax=max(b.rmax,b.sum+a.rmax);
 71         ret.ma=max(ret.lmax,ret.rmax);
 72         ret.ma=max(ret.ma,b.ma);
 73         ret.ma=max(ret.ma,a.ma);
 74         ret.ma=max(ret.ma,a.rmax+b.lmax);
 75  //       cout<<"s"<<a.lmax<<" "<<a.rmax<<" "<<a.ma<<" "<<a.sum<<endl;
 76         return ret;
 77     }
 78 }
 79
 80 int main()
 81 {
 82     int n;
 83     while(scanf("%d",&n)!=EOF)
 84     {
 85         memset(an,0,sizeof(an));
 86         memset(get,0,sizeof(get));
 87         for(int i=1;i<=n;i++)
 88         {
 89             scanf("%d",&an[i]);
 90         }
 91         for(int i=1;i<=n;i++)
 92         {
 93             get[i]=get[i-1]+an[i];
 94         }
 95         build(1,1,50010);
 96         int m;
 97         scanf("%d",&m);
 98         int a,b;
 99         for(int i=0;i<m;i++)
100         {
101             scanf("%d%d",&a,&b);
102             printf("%d\n",search(1,a,b).ma);
103         }
104     }
105     return 0;
106 }

时间: 2024-11-08 21:47:56

无修改区间查询 BNU Can you answer these queries I的相关文章

SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)

GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot solve but get Wrong Answer from most of the OI problems. And he refuse to write two program of same kind at all. So he always failes in contests. When

HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都是开平方,同一个数更新有限次数就一直是1了,所以可以这样优化 #include <stdio.h> #include<math.h> #define N 100010 #define LL __int64 #define lson l,m,rt<<1 #define rson

HDU-Can you answer these queries? (线段树+区间修改)

Problem Description A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the battleships. Each of the battleships can be marked a value of endurance. For every attack of ou

【数据结构】线段树 (定义 &amp; 点修改/区间查询)

[本文描述高级数据结构线段树的定义] [并解决 点修改/区间查询 的问题] 结构与定义 线段树的基本结构 ? 由图可知,线段树的每一个节点都代表着一段区间 且同一层的节点(深度相同的节点)所表示的区间互不重叠 所有叶子节点代表的区间左边界与右边界相同(叶子节点代表单个元素) 普遍规定 如果某个非叶子节点代表的区间包含元素个数为奇数 则它的左儿子包含的元素个数比右儿子大 1 在代码部分,非叶子节点表示区间为 [l,r] 则左儿子为 [ l , (l+r)/2 ] ,右儿子为 [ (l+r)/2+1

HDU 4027 Can you answer these queries? (线段树+区间点修改)

题意:给你 n 个数,m个询问(c,x,y) c==0 把x,y区间的值变为原来的平方根(向下取整) c==1 计算x,y区间的和. 利用1的开方永远为1剪枝.. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> //#include<map> #include<cmath> #include<iostream> #include

poj2104 划分树 区间K大 在线 无修改

博主sbit....对于高级数据结构深感无力,然后这些东西在OI竟然烂大街了,不搞就整个人都不好了呢. 于是我勇猛的跳进了这个大坑 ——sbit 区间K大的裸题,在线,无修改. 可以用归并树(\(O(nlog^3n)\)),也可用划分树(\(O(nlogn + mlogn)\)).果断划分树...(以后再来看归并树...再来看...来看..看..) 划分树是个什么东西呢?为什么可以做区间k大呢? 想想平衡树做k大时是如何搞的,其实内在原理是一样的. 划分树分两个步骤:建树与询问,这两个步骤相互关

poj2104 主席树 区间K大 在线 无修改

关于主席树: 主席树(Chairman Tree)是一种离线数据结构,使用函数式线段树维护每一时刻离散之后的数字出现的次数,由于各历史版本的线段树结构一致,可以相减得出区间信息,即该区间内出现的数字和对应的数量,由于在线段树内,左子树代表的数字都小与右子树,便可像平衡树一样进行K大询问.新建一颗树是\(O(logn)\),查询一次也为\(O(logn)\). 比划分树好想&写多了,但是在POJ上比划分树慢一些. CODE: 1 #include <cstdio> 2 #include

树状数组 区间修改+区间查询

其实直到不久前都几乎不会用树状数组,请教了PPZ大佬之后终于懂了一点点. 然后小蒟蒻现在才知道了树状数组区间修改+区间查询的方法QAQ 传送门 Codevs 线段树练习3 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<queu

【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作,每次为一下三种之一: RELEASE x:对x执行一次感染: RECENTER x:把根节点改为x,并对原来的根节点执行一次感染: REQUEST x:询问x子树中所有节点感染代价的平均值. 输入 输入的第一行包含两个整数n和m,分别代表局域网中计算机的数量,以及操作和询问的总数.接下来n-1行,