poj 3264 & poj 3468(线段树)
poj 3264
Sample Input
6 3
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output
6
3
0
求任一区间的最大值和最小值的差
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define N 50005
#define mod 258280327
#define MIN 0
#define MAX 1000001
struct node
{
int val,maxn,minx;
int Left,Right;
} pnode[4*N];
int a[N];
int tmax,tmin;
void build(int i,int l,int r)
{
pnode[i].Left = l;
pnode[i].Right = r;
pnode[i].maxn = MIN;
pnode[i].minx = MAX;
if(l == r)
return;
build(i*2,l ,(l+r)/2);
build(i*2+1, (l+r)/2 + 1,r);
} void insert(int i,int index,int va)
{
if(pnode[index].Left == pnode[index].Right)
{
pnode[index].maxn = pnode[index].minx = va;
return ;
}
pnode[index].maxn = max(pnode[index].maxn,va);
pnode[index].minx = min(pnode[index].minx,va);
int mid = (pnode[index].Left+pnode[index].Right)/2;
if (mid >= i)
insert(i,index*2,va);
else
insert(i,index*2+1, va);
} void query(int u,int l,int r,int a,int b)
{
// if(pnode[u].minx >= tmin && pnode[u].maxn < tmax)
// return;
if(a == l && b == r)
{
if(tmax < pnode[u].maxn)
tmax = pnode[u].maxn;
if(tmin > pnode[u].minx)
tmin = pnode[u].minx;
return ;
} int mid = (l + r)>>1;
if (mid >= b)
query(u*2,l, mid, a, b);
else if (mid < a)
query(u*2+1,mid+1, r, a, b);
else
{
query(u*2,l, mid, a, mid);
query( u*2+1,mid+1, r, mid+1, b);
}
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(1,1,n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
insert(i,1,a[i]);
} for(int i = 1; i <= m; i++)
{
int x,y;
tmax = -MAX;
tmin = MAX;
scanf("%d%d",&x,&y);
query(1,1,n,x,y);
printf("%d\n",tmax-tmin);
} return 0;
}
poj 3468
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
①对区间i - j 的数全加上c ; ②求区间的和
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
#define N 100005
#define mod 258280327
#define MIN 0
#define MAX 1000001 struct node
{
ll val,els;
int Left,Right;
} pnode[4*N]; int a[N];
int tmax,tmin;
void build(int i,int l,int r)
{
pnode[i].Left = l;
pnode[i].Right = r;
pnode[i].val = 0;
pnode[i].els = 0;
if(l == r)
return;
build(i*2,l ,(l+r)/2);
build(i*2+1, (l+r)/2 + 1,r);
} void insert(int i,int index,int va)
{
if(pnode[index].Left == pnode[index].Right)
{
pnode[index].val = va;
return ;
}
pnode[index].val+=va;
int mid = (pnode[index].Left+pnode[index].Right)/2;
if (mid >= i)
insert(i,index*2,va);
else
insert(i,index*2+1, va);
} void add(int u,int l,int r,ll c,int a,int b)
{
if(a == l && b == r)
{
pnode[u].els += c;
return ;
}
pnode[u].val += (b-a+1)*c; //让大于a,b的部分加上
if(l == r)
return ;
int mid = (l + r)>>1;
if (mid >= b)
add(u*2,l, mid, c, a, b);
else if (mid < a)
add(u*2+1,mid+1, r, c, a, b);
else
{
add(u*2,l, mid , c,a, mid);
add(u*2+1,mid+1, r,c, mid+1, b);
}
} long long query(int u,int l,int r,int a,int b)
{
if(a == l && b == r)
{
return pnode[u].val + (pnode[u].Right - pnode[u].Left + 1)*pnode[u].els;
}
pnode[u].val += (pnode[u].Right - pnode[u].Left + 1)*pnode[u].els;
//当取了a,b的附加值后,将其附加值往下放
add(u*2,pnode[u].Left,(pnode[u].Left + pnode[u].Right)/2,pnode[u].els,pnode[u].Left,(pnode[u].Left + pnode[u].Right)/2);
add(u*2+1,(pnode[u].Left+pnode[u].Right)/2+1,pnode[u].Right,pnode[u].els,(pnode[u].Left+pnode[u].Right)/2+1,pnode[u].Right);
pnode[u].els = 0;
int mid = (l + r)>>1;
if (mid >= b)
return query(u*2,l, mid, a, b);
else if (mid < a)
return query(u*2+1,mid+1, r, a, b);
else
{
return query(u*2,l, mid, a, mid)+query( u*2+1,mid+1, r, mid+1, b);
}
} int main()
{
int n,m,l,r,c;
char ch;
while(scanf("%d%d",&n,&m)!= EOF)
{
build(1,1,n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
insert(i,1,a[i]);
} for(int i = 1; i <= m; i++)
{
getchar();
ch = getchar();
if(ch == 'Q')
{
scanf("%d%d",&l,&r);
printf("%I64d\n",query(1,1,n,l,r));
}
if(ch == 'C')
{
scanf("%d%d%d",&l,&r,&c);
add(1,1,n,c,l,r);
}
}
}
return 0;
}
poj 3264 & poj 3468(线段树)的更多相关文章
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- POJ 3264 Balanced Lineup 线段树RMQ
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...
- [POJ] 3264 Balanced Lineup [线段树]
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34306 Accepted: 16137 ...
- poj 3264(RMQ或者线段树)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 42929 Accepted: 20184 ...
- POJ 3264 Balanced Lineup 线段树 第三题
Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...
- POJ - 3264 Balanced Lineup 线段树解RMQ
这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...
- POJ 3264 Balanced Lineup (线段树)
Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...
- poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
随机推荐
- DNS协议(一)
在互联网上要想与另外一台主机通信,要知道对方的IP地址,但是IP地址是很难记忆的, 比如百度的一台服务器的IP地址为115.239.210.27,我们在浏览器中输入http://115.239.210 ...
- I/O多路转接之poll 函数
poll 一.poll()函数: 这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,自认为poll和select大同小异,下面是这个函数的声明: #include < ...
- hp MSA50 5盘RAID5重建为4盘RAID5怎么恢复数据
[用户单位] XX省电视台[数据恢复故障描述] 一台HP 服务器,挂接一台HP MSA50磁盘阵列,内接5块1TB硬盘,原先结构为RAID5. 使用一段时间后,其中一块硬盘掉线,因RAID5支持一块硬 ...
- JAVA_SE基础——58.如何用jar命令对java工程进行打包
有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍, ...
- 说说cglib动态代理
前言 jdk中的动态代理通过反射类Proxy和InvocationHandler回调接口实现,要求委托类必须实现一个接口,只能对该类接口中定义的方法实现代理,这在实际编程中有一定的局限性. cglib ...
- 从一个事件绑定说起 - DOM
事件绑定的方式 给 DOM 元素绑定事件分为两大类:在 html 中直接绑定 和 在 JavaScript 中绑定. Bind in HTML 在 HTML 中绑定事件叫做内联绑定事件,HTML 的元 ...
- Django之views系统
Django的View(视图)简介 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...
- python中两种方法实现二分法查找,细致分析二分法查找算法
之前分析了好多排序算法,可难理解了呢!!(泣不成声)这次我要把二分查找总结一下,这个算法不算难度特别大,欢迎大家参考借鉴我不喜欢太官方的定义,太晦涩的语言,让人看了就头晕.我希望加入我自己的理解,能帮 ...
- nohup 与 & 的区别
nohup -- invoke a utility immune to hangups : 运行命令忽略挂起信号 & 是指后台运行: nohup 的功能和& 之间的功能并不相同.其中, ...
- 电脑上的安卓系统——PhoenixOS浅度体验
前言 其实这篇关于PhoenixOS的浅度评测在几个月前就准备发了,当时是刚看到新闻说Android 7.0 x86的正式版刚刚发布,于是就下载来安装一番,结果.....体验极差= =,只能用这4个字 ...