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,注 ...
随机推荐
- SQLAlchemy 教程 —— 基础入门篇
SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...
- 201621123043 《Java程序设计》第8周学习总结
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains的源代码如下 public boolean contain ...
- MySort实验报告
实验日期:2017.5.2 实验内容:利用sort方法对已给的数据进行重新排序. 实验原图: 对原代码进行添加,补充新的内容: 在for循环中,新输入一个变量j,并新定义新的长度toSort.leng ...
- 原生ajax的请求函数
ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务器.发送请求.接收响应 ...
- php代码开启缓冲的使用方法
php可以开启缓冲区,就是将内容放到缓冲区,再决定什么时候发送给浏览器. 感谢:http://www.jb51.net/article/38964.htm 解析PHP中ob_start()函数的用法 ...
- selenium在页面中多个fream的定位
在做页面元素定位的时候,遇到多fream的页面定位比较困难,需要先去切换到元素所在的fream才能成功定位. 1,切换到目标fream: driver.switch_to.frame('freamID ...
- js window
window对象: browser object mode :bom对象. bom提供了独立于内容而与浏览器窗口进行交互的对象. bom主要用于管理窗口与窗口之间的通讯,因此其核心对象是window ...
- vue表单详解——小白速会
一.基本用法 你可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定. 但 v-model 本质上不过是语法糖.它负责监听用户的 ...
- Jetty入门(1-1)Jetty入门教程
一.Jetty是什么? 1.Jetty 是一个Java语言编写的,开源的Servlet容器和应用服务器. Jetty 极度轻量级.高便携性.功能强大.灵活和扩展性好,而且支持各种技术如SPDY.Web ...
- python/MySQL练习题(二)
python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...