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 ...
随机推荐
- sgu101-欧拉回路
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wi ...
- 基于vue + axios + lrz.js 微信端图片压缩上传
业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能 ...
- hdu 3367 Pseudoforest(并查集)
题意:有一种叫作Pseudoforest的结构,表示在无向图上,每一个块中选取至多包含一个环的边的集合,又称“伪森林”.问这个集合中的所有边权之和最大是多少? 分析:如果没有环,那么构造的就是最大生成 ...
- APICloud打包Vue单页应用
APICloud新建项目后,会生成以下目录结构 其中index.html是入口文件,而vue-cli打包生成的文件是在dist目录下 ├─dist│ └─static│ ├─css│ └─js │ └ ...
- iOS 获取LaunchImage启动图
iOS开发中,LaunchImage图片会根据手机机型的不同,自动匹配对应的图片,而我们如果想要拿到对应的图片,无法直接通过图片的名字获取该启动图,而需要通过以下方式 + (NSString *)ge ...
- [转载]Axis2 and CXF的比较
在Celtix 和XFire 宣布合并的同年,另一个著名开源Web 服务框架Axis 的后继者Axis2 也诞生了.Axis2 并非Axis 的2.0 版,而是完全重写了Axis 的新项目.作为功能和 ...
- ubuntu安装源
1.编辑sources.list文件 sudo vi /etc/apt/sources.list 添加以下安装源 #台湾源 deb http://tw.archive.ubuntu.com/ubunt ...
- Mysql:1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'错误解决
select distinct b.sale_count from product_sale b where b.pro_id in (select a.pro_id from product a L ...
- Spring整合JMS(消息中间件)
这一节来说说,异步机制及spring对JMS封装 一.消息异步处理 类似于RMI.Hessian.Burlap等远程方法调用,它们都是同步的,所谓同步调用就是客户端必须等待操作完成,如果远程服务没有返 ...
- 快速清除MS SQL SERVER 日志
USE [master] GO ALTER DATABASE yourdatabase SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE yourd ...