模板

 #include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<math.h>
//#include<bitset>
//#include<iostream>
using namespace std; int n,m,q;
#define maxn 100011
#define maxm 361
#define LL long long
const LL inf=1e18;
LL a[maxn],add[maxm],be[maxm],sum[maxm],Max[maxm],Min[maxm]; bool hasbe[maxm];
int bel[maxn],tot; void down(int x)
{
int l=(x-)*m+,r=min(x*m,n);
for (int i=l;i<=r;i++)
{
if (add[x]) a[i]+=add[x];
else if (hasbe[x]) a[i]=be[x];
}
add[x]=hasbe[x]=;
}
void up(int x)
{
int l=(x-)*m+,r=min(x*m,n);
sum[x]=; Max[x]=-inf; Min[x]=inf;
for (int i=l;i<=r;i++)
sum[x]+=a[i],Max[x]=max(Max[x],a[i]),Min[x]=min(Min[x],a[i]);
}
void Addsingle(int x,int y,int v)
{
down(bel[x]);
for (int i=x;i<=y;i++) a[i]+=v;
up(bel[x]);
}
void Add(int x,int y,int v)
{
if (bel[x]==bel[y]) Addsingle(x,y,v);
else
{
int j;
for (j=x;bel[j]==bel[x];j++);
Addsingle(x,j-,v);
for (j=y;bel[j]==bel[y];j--);
Addsingle(j+,y,v);
for (int i=bel[x]+;i<bel[y];i++)
{
if (hasbe[i]) be[i]+=v;
else add[i]+=v;
sum[i]+=1ll*m*v;
Max[i]+=v; Min[i]+=v;
}
}
}
void Besingle(int x,int y,int v)
{
down(bel[x]);
for (int i=x;i<=y;i++) a[i]=v;
up(bel[x]);
}
void Be(int x,int y,int v)
{
if (bel[x]==bel[y]) Besingle(x,y,v);
else
{
int j;
for (j=x;bel[j]==bel[x];j++);
Besingle(x,j-,v);
for (j=y;bel[j]==bel[y];j--);
Besingle(j+,y,v);
for (int i=bel[x]+;i<bel[y];i++)
{
if (add[i]) add[i]=;
hasbe[i]=; be[i]=v;
sum[i]=1ll*m*v;
Max[i]=Min[i]=v;
}
}
}
LL qsumsingle(int x,int y)
{
LL ans=;
for (int i=x;i<=y;i++)
{
if (hasbe[bel[i]]) ans+=be[bel[i]];
else ans+=a[i]+add[bel[i]];
}
return ans;
}
LL qsum(int x,int y)
{
if (bel[x]==bel[y]) return qsumsingle(x,y);
else
{
int j;
for (j=x;bel[j]==bel[x];j++);
LL ans=qsumsingle(x,j-);
for (j=y;bel[j]==bel[y];j--);
ans+=qsumsingle(j+,y);
for (int i=bel[x]+;i<bel[y];i++) ans+=sum[i];
return ans;
}
}
LL qmaxsingle(int x,int y)
{
LL ans=-inf;
for (int i=x;i<=y;i++)
{
if (hasbe[bel[i]]) ans=max(ans,be[bel[i]]);
else ans=max(ans,a[i]+add[bel[i]]);
}
return ans;
}
LL qmax(int x,int y)
{
if (bel[x]==bel[y]) return qmaxsingle(x,y);
else
{
int j;
for (j=x;bel[j]==bel[x];j++);
LL ans=qmaxsingle(x,j-);
for (j=y;bel[j]==bel[y];j--);
ans=max(ans,qmaxsingle(j+,y));
for (int i=bel[x]+;i<bel[y];i++) ans=max(ans,Max[i]);
return ans;
}
}
LL qminsingle(int x,int y)
{
LL ans=inf;
for (int i=x;i<=y;i++)
{
if (hasbe[bel[i]]) ans=min(ans,be[bel[i]]);
else ans=min(ans,a[i]+add[bel[i]]);
}
return ans;
}
LL qmin(int x,int y)
{
if (bel[x]==bel[y]) return qminsingle(x,y);
else
{
int j;
for (j=x;bel[j]==bel[x];j++);
LL ans=qminsingle(x,j-);
for (j=y;bel[j]==bel[y];j--);
ans=min(ans,qminsingle(j+,y));
for (int i=bel[x]+;i<bel[y];i++) ans=min(ans,Min[i]);
return ans;
}
}
int main()
{
scanf("%d%d",&n,&q);
m=(int)sqrt(n);
for (int i=;i<=n;i++) bel[i]=(i-)/m+;
tot=bel[n];
for (int i=;i<=tot;i++) Max[i]=-inf,Min[i]=inf;
for (int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[bel[i]]+=a[i];
Max[bel[i]]=max(Max[bel[i]],a[i]);
Min[bel[i]]=min(Min[bel[i]],a[i]);
} char c[];int x,y,z;
while (q--)
{
scanf("%s%d%d",c,&x,&y);
if (c[]=='a') scanf("%d",&z),Add(x,y,z);
else if (c[]=='e') scanf("%d",&z),Be(x,y,z);
else if (c[]=='u') printf("%lld\n",qsum(x,y));
else if (c[]=='a') printf("%lld\n",qmax(x,y));
else printf("%lld\n",qmin(x,y));
}
return ;
}

分块试水--CODEVS4927 线段树练习5的更多相关文章

  1. 分块试水--CODEVS5037 线段树练习4加强版

    感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...

  2. codevs4927 线段树练习5

    题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的所有数都增加c set a b c:把区间[a,b]内的所有数都设为c sum a b:查询区间[a,b] ...

  3. 51NOD 1287 加农炮(不水的线段树)

    >>点击进入原题测试<< Input示例 Output示例 思路:刚开始以为结点存最大值就行了,然后大于左子树的最大值就能进入右子树:然后发现样例都过不了:后面发现,并不是这个 ...

  4. 【wikioi】1191 数轴染色(线段树+水题)

    http://wikioi.com/problem/1191/ 太水的线段树了,敲了10分钟就敲完了,但是听说还有一种并查集的做法?不明觉厉. #include <cstdio> #inc ...

  5. 2014 Super Training #9 F A Simple Tree Problem --DFS+线段树

    原题: ZOJ 3686 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3686 这题本来是一个比较水的线段树,结果一个ma ...

  6. 【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯

    Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...

  7. [CF52C]Circular RMQ【线段树】

    题目大意 给你一个环形数列,完成环形数列上区间加法和区间求最小值. 分析 算是一道比较水的线段树模板题. 如果l>r的话,那么修改l,n和1,r区间. 不然的话那么就修改l,r区间. 其他的基础 ...

  8. P2801 教主的魔法 (线段树)

    题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...

  9. HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护

    给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...

随机推荐

  1. [读书笔记3]《C语言嵌入式系统编程修炼》

    第五章 性能优化   5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法.   写一个"标准"宏MIN ...

  2. 循环语言(for)

    循环语句: 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如果满足则进入for语句循环,for语句内的代码执行完毕之后,将按照状态改变改变变量,然后判断是否符合循环条件,符合继 ...

  3. Win7访问不了WINXP共享文件

    用win xp的机器可以访问,但用win 7的机器无法访问共享文件 提示:您没有权限访问.请与网络管理员联系请求访问权限 网上找了相应的资料 做了如下动作 1. 打开网上邻居→本地连接→属性里,“看是 ...

  4. 以POST方式推送JSON数据,并接收返回的服务器消息

    private static string GetResult(string jsonString, string type) { string url = GetUrl(type); string ...

  5. 浅谈IFC

    IFC布局规则: 在一个行内格式化上下文中,盒是一个接一个水平放置的,从包含块的顶部开始 这些盒之间的水平margin,border和padding都有效 盒可能以不同的方式竖直对齐:以它们的底部或者 ...

  6. POJ2152 Fire (树形DP)

    题意:n个城市n-1条边 组成一棵树 在每个城市修建消防站会有一个花费costi 每个城市能防火当且仅当地图上距离他最近的消防站距离小于di   问如何修建消防站 使地图上所有的城市都有预防火灾的能力 ...

  7. HDU5834 Magic boy Bi Luo with his excited tree (树形DP)

    题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...

  8. Scrapy 组件的具体用法

    一.Spider 用法 在 Scrapy 中,要抓取网站的链接配置.抓取逻辑.解析逻辑都是在 Spider 里完成的.Spider 的一些基础属性和基础方法: name:爬虫名字,Spider的名字定 ...

  9. JQuery 的toggle() 方法如何使用?

    JQuery中的toggle()方法,相当于点一个元素时,重复循环两个函数,而这两个函数可以作为toggle()函数的两个参数传进去,当第一次点击的时候会执行前面的参数,而第二次点击时执行的是后面的参 ...

  10. IP地址、MAC地址、ARP地址解析协议

    互联网中一台主机要和另一台主机实现通信首先需要知道彼此在互联网中的位置,主机在互联网中的位置是通过ip地址标记的,当找到ip地址后,再通过端口号标识运行在主机中的进程从而实现通信. IP地址: IP地 ...