WUST 1255 巧克力(线段树的单点区间更新查询)
1355: 巧克力
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Submitted: 190 Accepted: 26
[ Submit][ Status][ Web Board]
Description
TY最喜欢做的事情就是吃巧克力,经常幻想拥有吃不完的巧克力,作为一个acmer(菜机),IcY出了个问题准备考考她,如果回答出来,那巧克力自然是源源不断的啦。
IcY给出了一列排好的的巧克力,有的是德芙,有的是费列罗,它们都拥有不同的美味值……现在IcY通过魔法更改了这些巧克力,TY必须能指出排列中第K个是巧克力的美味值是多少和某一段巧克力中最美味的值是多少,才能吃到巧克力,否则,哼哼,就去乖乖的做题吧。现在,TY来寻求你的帮助,你能让poor TY吃上巧克力吗?
Input
输入数据有很多组,以EOF结尾。
每组数据第一行是2个整数N,M。N代表初始的巧克力数目,M代表操作数。
第二行含有n个正整数,代表每块巧克力的美味值wi。每块巧克力的下标从0--n-1。
接下来的M行,表示M个操作。
操作分4种:
Query x y 代表查询某一个区间内的美味最大值。
Ask x 代表查询某一块巧克力的美味值。
Change x y 代表将第x块的美味值变成y
Add x y 代表讲从第x块到第y块巧克力的美味值分别增加1.
(1 <= N<= 100000 1<= M <= 100000 Wi <= 5000 )
Output
对于每一个Query输出一个整数,代表区间内的美味最大值。
对于每一个Ask 输出一个整数,代表这块巧克力的美味值。
Sample Input ![](http://acm.wust.edu.cn/image/copy.gif)
10 4
1 2 3 4 5 6 7 8 9 10
Ask 0
Change 0 1
Add 0 2
Query 0 2
Sample Output
1
4
[ Submit][ Status][ Web Board]
题解:
这是我们学校oj的一题,老赵看到很多人tle就让我做了,第一次数组开小了就TLE了,改了下就过了。。。考察的比较基础,还有就是要lazy tag不然会超时,对于经历过线段树专题的我这题还是很水的hhhhh,500ms过的
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<string>
#include<stdio.h>
#include<queue>
#include<stack>
#include<map>
#include<deque>
#define M (t[k].l+t[k].r)/2
#define lson k*2
#define rson k*2+1
using namespace std;
struct node
{int l,r;int maxx;//区间极值int tag;//延迟标记
}t[100005*4];
void pushup(int k)//区间合并,向上更新
{t[k].maxx=max(t[lson].maxx,t[rson].maxx);
}
void Build(int l,int r,int k)//日常建树
{t[k].l=l;t[k].r=r;t[k].tag=0;if(l==r){scanf("%d",&t[k].maxx);return;}int mid=M;Build(l,mid,lson);Build(mid+1,r,rson);pushup(k);
}
void pushdown(int k)//向下更新
{if(t[k].tag){t[lson].maxx+=t[k].tag;t[rson].maxx+=t[k].tag;t[lson].tag+=t[k].tag;t[rson].tag+=t[k].tag;t[k].tag=0;}
}
void update1(int l,int r,int k,int v)//线段树的区间更新
{if(t[k].l==l&&t[k].r==r){t[k].maxx+=v;t[k].tag+=v;return;}pushdown(k);int mid=M;if(r<=mid)update1(l,r,lson,v);else if(l>mid)update1(l,r,rson,v);else{update1(l,mid,lson,v);update1(mid+1,r,rson,v);}pushup(k);
}
void update2(int x,int k,int v)//线段树的单点更新
{if(t[k].l==t[k].r){t[k].maxx=v;return;}pushdown(k);int mid=M;if(x<=mid)update2(x,lson,v);elseupdate2(x,rson,v);pushup(k);
}
int query1(int l,int r,int k)//线段树的区间查询
{if(t[k].l==l&&t[k].r==r){return t[k].maxx;}pushdown(k);int mid=M;if(r<=mid)return query1(l,r,lson);else if(l>mid)return query1(l,r,rson);else{return max(query1(l,mid,lson),query1(mid+1,r,rson));}
}
int query2(int x,int k)//线段树的单点查询
{if(t[k].l==t[k].r){return t[k].maxx;}pushdown(k);int mid=M;if(x<=mid)return query2(x,lson);elsereturn query2(x,rson);
}
int main()
{int n,m,i,j,x,y,z;char s[10];while(scanf("%d%d",&n,&m)!=EOF){Build(0,n-1,1);for(i=0;i<m;i++){scanf("%s",s);//可以跳掉空格换行if(strcmp(s,"Ask")==0){scanf("%d",&x);printf("%d\n",query2(x,1));}else if(strcmp(s,"Change")==0){scanf("%d%d",&x,&y);update2(x,1,y);}else if(strcmp(s,"Add")==0){scanf("%d%d",&x,&y);if(x>y)swap(x,y);update1(x,y,1,1);}else{scanf("%d%d",&x,&y);if(x>y)swap(x,y);printf("%d\n",query1(x,y,1));}}}return 0;
}
WUST 1255 巧克力(线段树的单点区间更新查询)相关推荐
- 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)
题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...
- 数据结构之线段树进阶(区间更新lazy标记)
之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...
- HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 线段树之单点更新,区域求和
线段树之单点更新,区域求和 今天在coreforces上做的一题 E. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory ...
- 线段树(单点修改,区间查询)
引入 题目描述题目描述题目描述 100001000010000个正整数,编号从111到100001000010000,用A[1]A[1]A[1],A[2]A[2]A[2],A[10000]A[1000 ...
- 线段树2 求区间最小值
线段树2 求区间最小值 递归,DFS,尤其是二叉树,我只要知道我的返回节点就好,因为DFS的顺序一定是一样的,不同的题目和数据范围也是一样的,只是返回节点让DFS的深度不同. 递归的内容只有两部分:1 ...
- UESTC 1601 艾尔大停电2 二维树状数组+区间更新
艾尔大停电2 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]
寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...
- 【初学线段树,看这篇文章准没错】线段树(单点修改and区间修改)acm寒假集训日记22/1/10
线段树 线段树是算法竞赛中常用的用来维护区间信息的数据结构.是一名ACMer 需要掌握的一种基础.重要的数据结构线段树可以在O(logN)的时间复杂度内实现单点修改,区间修改,区间查询(区间求和,区间 ...
最新文章
- C语言数据类型所占空间大小
- oracle增加数据时报没安装java_在linux上安装Oracle Developer Tools for VS Code
- Oracle数据库的基本语法
- 王者归来:分布式调度解决方案 ElasticJob 重启!
- Python 技术篇-mac下安装、卸载pip方法
- Dima and a Bad XOR
- 架构:Android 组件化开发
- 非平坦结构元matlab,基于MATLAB的巴特沃思型数字滤波器设计.doc
- 辽宁师范大学计算机学院邹丽,邹丽(运载工程与力学学部)老师 - 大连理工大学 - 院校大全...
- Python风格总结:模块调用
- bower——库管理工具
- 开发你自己的XMPP 续 - Openfire 插件开发
- C#获取枚举的key-value格式
- 蓝桥云课练习题 用杂志拼接信件
- int数组转strpython_python中int与str互转方法
- ubuntu pci wifi bcm4322 无法使用 解决方法
- 几何画板在教学中的常见应用
- 温度传感器都有哪些?
- php仿果壳网,模仿,令我们更亲近
- 搜狗输入法简约而美的皮肤推荐
热门文章
- Jmeter 安装及使用教程
- scrapy由浅入深(三) selenium模拟爬取ajax动态页面(智联招聘)
- STM32F10xxx系统RCC讲解
- 云耀云服务器性能怎么样,华为云耀云服务器性能如何 – 附详细测评教程
- 钱咖是真的吗?钱咖怎么提现?钱咖怎么收徒弟快?钱咖赚钱容易吗?
- asp.net+sqlserver+C#网上选课系统
- np.random.normal()正态分布
- php-ml 逻辑回归,TensorFlow ML cookbook 第三章6-8节 套索和岭回归、弹性网络回归and Logistic回归...
- 《侍道外传:刀神》:一款优秀的ARPG,如何让武士沦为“还债的神”?
- uniCloud开发公众号:三、生成带参数二维码