HDU 之 I Hate It
Description
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
学生ID编号分别从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
Output
Sample Input
Sample Output
#include <stdio.h>
#include <string.h> struct N
{
int w;
}q[550000]; int max(int a, int b)
{
return a>b?a:b;
} void build(int x, int k, int left, int right, int rt )
{
if(x<left || x>right )
{
return ;
}
if(x==left && x==right )
{
q[rt].w = k;
return;
}
build(x, k, left, (left+right)/2, rt*2 );
build(x, k, (left+right)/2+1, right, rt*2+1 );
q[rt].w = max( q[rt*2].w, q[rt*2+1].w ) ;
} int query(int ll, int rr, int left, int right, int rt )
{
if(rr<left || ll>right )
{
return 0;
}
if(ll<=left && rr>=right )
{
return q[rt].w;
}
return max(query(ll, rr, left, (left+right)/2, rt*2),query(ll, rr,
(left+right)/2+1,right, rt*2+1 ));
} int main()
{
int n, m;
int i, j;
char ch;
int ss, dd;
int A; int B;
while(scanf("%d %d", &n, &m)!=EOF)
{
for(i=1; i<=n; i++)
{
scanf("%d%*c", &dd); //cha ru
build(i,dd, 1, n, 1);
}
for(j=0; j<m; j++)
{
scanf("%c %d %d%*c", &ch, &A, &B); if(ch=='Q')
{
ss = query(A, B, 1, n, 1) ;
printf("%d\n", ss );
}
else if(ch=='U')
{
build(A, B, 1, n, 1);
} }
}
return 0;
}
别人的写法:
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std; const int MAXNODE = 524288; // 1<<19
const int MAXST = 200001;
struct STU{
int grade;
int left,right;
}st[MAXNODE]; int father[MAXST]; void BuildTree(int i,int left,int right){ // i是结点的序号 对应了数组下标
st[i].left = left;
st[i].right = right;
st[i].grade = 0; // 初始化为0
if (left == right)
{
father[left] = i; // 为了更新的时候从下往上 一直到顶
return;
}
BuildTree(i*2, left, (int)floor( (right+left) / 2.0));
BuildTree(i*2+1, (int)floor( (right+left) / 2.0) + 1, right);
} void UpdataTree(int ri)// 从下往上更新
{
if (ri == 1)
{
return;
}
int fi = ri / 2; // 父结点
int a = st[fi<<1].grade; // 该父结点的两个子结点
int b = st[(fi<<1)+1].grade; st[fi].grade = (a > b)?(a):(b);
UpdataTree(ri/2); } int Max;
void Query(int i,int l,int r){ // i为区间的序号,四段查询 即四种情况 if (st[i].left == l && st[i].right == r) // 找到了一个完全重合的区间
{
Max = (Max < st[i].grade)?st[i].grade:(Max);
return ;
}
i = i << 1; // left child of the tree
if (l <= st[i].right) // 左区间有覆盖
{
if (r <= st[i].right) // 全包含于左区间
{
Query(i, l, r);
}
else // 半包含于左区间
{
Query(i, l, st[i].right);
}
}
i += 1; // right child of the tree
if (r >= st[i].left) // 右区间有覆盖
{
if (l >= st[i].left) // 全包含于右区间
Query(i, l, r);
else // 半包含于左区间
Query(i, st[i].left, r);
}
} int main()
{
int n_s,n_q,igrade; while(scanf("%d %d",&n_s,&n_q) != EOF){
BuildTree(1, 1, n_s);
for (int i= 1 ; i <= n_s; i++)
{
scanf("%d", &igrade ); st[father[i]].grade = igrade; // 底层的无条件更新成绩 UpdataTree(father[i]);
}
while(n_q--)
{
char o[3];int a,b; scanf("%s %d %d",o,&a,&b); if ( o[0] == 'Q')
{
Max = 0;
Query(1, a, b);
printf("%d\n",Max);
}
else
{
st[father[a]].grade = b; // 底层的无条件更新成绩
UpdataTree(father[a]);
}
}
}
return 0;
}
HDU 之 I Hate It的更多相关文章
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
- hdu 4329
problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟 a. p(r)= R'/i rel(r)=(1||0) R ...
- HDU 2586
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:求最近祖先节点的权值和 思路:LCA Tarjan算法 #include <stdio.h&g ...
随机推荐
- Atitit.获取approot api 应用根路径 java c#.net php asp
Atitit.获取approot api 应用根路径 java c#.net php asp 1. 如果根路径返回empty,否则返回/app,兼容getContextPath() <scrip ...
- [译]GLUT教程 - 位图和正交投影视图
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts and Orthogonal Projecti ...
- root 执行过程权限问题
mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法 权限问题,授权 给 root 所有sql ...
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...
- 好文章收藏--五分钟理解一致性哈希算法(consistent hashing)
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...
- Android Handler警告,SimpleDateFormat警告
1:Handler// This Handler class should be static or leaks might occur: IncomingHandler @SuppressLi ...
- JavaWeb学习总结第六篇--认识Session机制
认识Session机制 前文也提到过,常用的会话跟踪有两种技术:Cookie和Session.今天就为大家讲解一下Session机制. 什么是Session? Session是另一种记录客户状态的机制 ...
- drawRect setNeedsDisplay layoutSubViews
drawRect setNeedsDisplay layoutSubViews 1. drawRect: is invoked automaticall,never call it directl ...
- Android自定义属性format类型
1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...
- RabbitMQ与Redis做队列比较
本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求简要介绍RabbitMQRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件 ...