cdoj1324卿学姐与公主
2016-05-03 18:04
381 查看
地址:http://acm.uestc.edu.cn/#/problem/show/1324
卿学姐与公主
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏
在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中。
英勇的卿学姐拔出利刃冲向了拯救公主的道路。
走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关。
在这个城关面前的是魔王的精锐部队,这些士兵成一字排开。
卿学姐的武器每次只能攻击一个士兵,并造成一定伤害,卿学姐想知道某时刻从LL到RR这个区间内,从开始到现在累计受伤最严重的士兵受到的伤害。
最开始每个士兵的受到的伤害都是0
Input
第一行两个整数N,QN,Q表示总共有NN个士兵编号从11到NN,和QQ个操作。
接下来QQ行,每行三个整数,首先输入一个tt,如果tt是11,那么输入p,xp,x,表示卿学姐攻击了pp这个位置的士兵,并造成了xx的伤害。如果tt是22,那么输入L,RL,R,表示卿学姐想知道现在[L,R][L,R]闭区间内,受伤最严重的士兵受到的伤害。
1≤N≤1000001≤N≤100000
1≤Q≤1000001≤Q≤100000
1≤p≤N1≤p≤N
1≤x≤1000001≤x≤100000
1≤L≤R≤N1≤L≤R≤N
Output
对于每个询问,回答相应的值
Sample input and output
Sample Input | Sample Output |
---|---|
5 4 2 1 2 1 2 4 1 3 5 2 3 3 |
0 5 |
Hint
注意可能会爆int哦
思路:
A - 卿学姐与公主
这是专题里少的可怜的水题之一啊!!!
这题是单点更新,区间查询(求最大值)。
用build函数构建线段树,然后update进行单点更新,query查询最大值就好了、、、
节点的附加信息是max,所受伤害的最大值,update就更新的这个
然后自己手写一波就好了(其实我是用的以前写的模板,改了一点东西就好了
线段树的相关内容可以去我博客里找找。。
ac代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <cstring> #include <queue> #include <stack> #include <map> #include <vector> #include <cstdlib> #include <string> #define PI acos((double)-1) #define E exp(double(1)) using namespace std; //#define MOD 772002+233 #define K 100000 struct node { long long maxt,sum; long long left,right; }; struct node tree[4*K+4]; long long a[3*K+4]; int build(int id,int l,int r) { tree[id].left=l;tree[id].right=r; if(l==r) { tree[id].maxt=tree[id].sum=a[l]; } else { build(2*id,l,(l+r)/2); build(2*id+1,(l+r)/2+1,r); tree[id].maxt=max(tree[2*id].maxt,tree[2*id+1].maxt); tree[id].sum=(tree[2*id].sum+tree[2*id+1].sum); } return 0; } int update(int id,int pos,long long v) { if(tree[id].left == tree[id].right) { tree[id].sum=tree[id].maxt=v+tree[id].sum; } else { int mid=(tree[id].left+tree[id].right)/2; if (pos<=mid) update(id*2,pos,v); else update(id*2+1,pos,v); tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum); tree[id].maxt=max(tree[id*2].maxt,tree[id*2+1].maxt); } return 0; } long long querySum(int id,int l,int r) { if (tree[id].left==l&&tree[id].right==r) return tree[id].sum; else { int mid=(tree[id].left+tree[id].right)/2; if (r<=mid) return querySum(id*2,l,r); else if (l>mid) return querySum(id*2+1,l,r); else return querySum(id*2,l,mid)+querySum(id*2+1,mid+1,r); } } long long queryMax(int id,int l,int r) { if(l==tree[id].left && r==tree[id].right) return tree[id].maxt; int mid=(tree[id].left+tree[id].right)>>1; long long ret=0; if(r<=mid) ret=max(ret,queryMax(id<<1,l,r)); else if(l>=mid+1) ret=max(ret,queryMax((id<<1)+1,l,r)); else { long long a,b; a=queryMax(id<<1,l,mid); b=queryMax((id<<1)+1,mid+1,r); return max(a,b); } return ret; } int main (void) { int n,q; cin>>n>>q; memset(a,0,sizeof(a)); build(1,1,n); while(q--) { int t; scanf("%d",&t); if(t==1) { long long x,y; scanf("%lld%lld",&x,&y); update(1,x,y); } else { int x,y; scanf("%d%d",&x,&y); printf("%lld\n",queryMax(1,x,y)); } } return 0; }View Code
相关文章推荐
- IOS开发证书变成“此证书的签发者无效”解决方法
- 2、Java的垃圾回收机制的简单理解
- vnc 简单安装及配置
- oralce 函数 FOR windows 跟踪神器
- 网上盗刷事件频发 风险肇始于“快捷支付”?
- 二维码工具类 - QrcodeUtils.java
- java.util.HashMap在多线程环境中可能出现的问题
- 仿照QQ列表展开效果
- UITtextView的几种回收键盘的方法
- Android下编译可执行文件
- C++使用STL:慎重选择删除元素的方法
- 无需安装Mono的Jexus
- 2016-5-3
- SUN小型机配件大全
- Eclipse + Pydev开发Python时import报错解决方法
- 第一个three.js程序
- void 类型指针以及指针数组
- AJAX学习笔记一
- 网络编程--Volley之ImageLoader
- 205. Isomorphic Strings