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 ...
随机推荐
- MQTT--mosquitto使用详解
mosquitto_pub(发布)的用法 用法: mosquitto_pub [-d] [-h hostname] [-i client_id] [-I client id prefix] [-p p ...
- win7上python+theano+keras安装
https://blog.csdn.net/yongjiankuang/article/details/50485610 其实过程很简单,首先说一下安装条件: 1.win7 (32和64都可以,下载安 ...
- notepad 替换行收尾字符串或在行首尾新增字符
用 Notepad++ 打开,把每一个将要放在表中单元格的内容放一行(注: ^ 代表行首 $ 代表行尾) 去除行尾空格和空白行:按CTRL+H 选择正则表达式-- 查找目标:\s+$ 替换为空 去除行 ...
- member access within misaligned address 0x000000000031 for type 'struct ListNode', which requires 8 byte alignment
在做LeetCode的two sum题目的时候,提交代码遇到了如题的runtime error,后来在一篇博客上看到了解决方法. 现有如下结构体: struct ListNode { int val; ...
- 4Sum_leetCode
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- MySQL视图概述
1.介绍 在传统关系型数据库里,视图有时也被称作虚表,是基于特定SQL结果集的虚拟数据表.在有些场合会变得很方便,例如:原有系统重构,旧的数据表A和B已经被拆分和合并到数据表C.D.F里面,为了实现平 ...
- 【Mysql】之基础sql语句模板
==============新建数据库============ create database if not exists XXX; ==============删除数据库============ d ...
- ztreeSearch
$.fn.extend({ ztreeSearch : function(options) { // var _self=$(this); var defaults = { id : '', sear ...
- Ajax跨域请求,无法传递及接收cookie信息解决方案
最近的项目中涉及到了应用ajax请求后台系统登录,身份认证失败,经过不断的调试终于找到解决方案. 应用场景: 项目测试环境:前端应用HTML,js,jQuery ajax请求,部署在Apache服务器 ...
- app 之间发送文件 ios
本文转载至 http://www.51094.com/?p=212 第一种: 发送一个正常的 pdf 文件,只要是能读取pdf 的都能得到响应 -(IBAction)openDocumentIn ...