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 

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 巧克力(线段树的单点区间更新查询)相关推荐

  1. 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)

    题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...

  2. 数据结构之线段树进阶(区间更新lazy标记)

    之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...

  3. HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. 线段树之单点更新,区域求和

    线段树之单点更新,区域求和 今天在coreforces上做的一题 E. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory ...

  5. 线段树(单点修改,区间查询)

    引入 题目描述题目描述题目描述 100001000010000个正整数,编号从111到100001000010000,用A[1]A[1]A[1],A[2]A[2]A[2],A[10000]A[1000 ...

  6. 线段树2 求区间最小值

    线段树2 求区间最小值 递归,DFS,尤其是二叉树,我只要知道我的返回节点就好,因为DFS的顺序一定是一样的,不同的题目和数据范围也是一样的,只是返回节点让DFS的深度不同. 递归的内容只有两部分:1 ...

  7. UESTC 1601 艾尔大停电2 二维树状数组+区间更新

    艾尔大停电2 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  S ...

  8. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  9. 【初学线段树,看这篇文章准没错】线段树(单点修改and区间修改)acm寒假集训日记22/1/10

    线段树 线段树是算法竞赛中常用的用来维护区间信息的数据结构.是一名ACMer 需要掌握的一种基础.重要的数据结构线段树可以在O(logN)的时间复杂度内实现单点修改,区间修改,区间查询(区间求和,区间 ...

最新文章

  1. C语言数据类型所占空间大小
  2. oracle增加数据时报没安装java_在linux上安装Oracle Developer Tools for VS Code
  3. Oracle数据库的基本语法
  4. 王者归来:分布式调度解决方案 ElasticJob 重启!
  5. Python 技术篇-mac下安装、卸载pip方法
  6. Dima and a Bad XOR
  7. 架构:Android 组件化开发
  8. 非平坦结构元matlab,基于MATLAB的巴特沃思型数字滤波器设计.doc
  9. 辽宁师范大学计算机学院邹丽,邹丽(运载工程与力学学部)老师 - 大连理工大学 - 院校大全...
  10. Python风格总结:模块调用
  11. bower——库管理工具
  12. 开发你自己的XMPP 续 - Openfire 插件开发
  13. C#获取枚举的key-value格式
  14. 蓝桥云课练习题 用杂志拼接信件
  15. int数组转strpython_python中int与str互转方法
  16. ubuntu pci wifi bcm4322 无法使用 解决方法
  17. 几何画板在教学中的常见应用
  18. 温度传感器都有哪些?
  19. php仿果壳网,模仿,令我们更亲近
  20. 搜狗输入法简约而美的皮肤推荐

热门文章

  1. Jmeter 安装及使用教程
  2. scrapy由浅入深(三) selenium模拟爬取ajax动态页面(智联招聘)
  3. STM32F10xxx系统RCC讲解
  4. 云耀云服务器性能怎么样,华为云耀云服务器性能如何 – 附详细测评教程
  5. 钱咖是真的吗?钱咖怎么提现?钱咖怎么收徒弟快?钱咖赚钱容易吗?
  6. asp.net+sqlserver+C#网上选课系统
  7. np.random.normal()正态分布
  8. php-ml 逻辑回归,TensorFlow ML cookbook 第三章6-8节 套索和岭回归、弹性网络回归and Logistic回归...
  9. 《侍道外传:刀神》:一款优秀的ARPG,如何让武士沦为“还债的神”?
  10. uniCloud开发公众号:三、生成带参数二维码