HDU1754-I Hate It,线段数水题~~2016.4.11
I Hate It
Time Limit: 9000/3000 MS
(Java/Others)
Memory Limit: 32768/32768
K (Java/Others)
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
在每个测试的第一行,有两个正整数 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。
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
5
6
5
9HintHuge input,the C function scanf() will work better than cin
只能怪自己知识算法掌握得不够,开始用线段数做,看起来和敌兵布阵一样,但一个CE一个RE,绝望啊,看起来一样,而且运行也没有错,趁着吃饭的时间又打了遍,AC~~~再看看以前的代码,然后就明白了自己的不足--没有虚心潜心学习,明白了一点就沾沾自喜,以为自己掌握了,结果.................
CE代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const int N=200000+50;
struct node
{
int l,r,n;
}a[N<<2];
int max(int a,int b)
{
return a>b?a:b;
}
void build(int l,int r,int k)
{
int mid;
if(l==r)
{
a[k].l=a[k].r=l;
a[k].n=0;
return ;
}
mid=(l+r)/2;
a[k].l=l,a[k].r=r;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
}
void insert(int n,int d,int k)
{
int mid;
if(a[k].l==a[k].r&&a[k].r==d)
{
a[k].n+=n;
return ;
}
mid=(a[k].l+a[k].r)/2;
if(d<=mid) insert(n,d,2*k);
else insert(n,d,2*k+1);
a[k].n=max(a[k*2].n,a[k*2+1].n);
}
void xiugai(int n,int d,int k)
{
int mid;
if(a[k].l==a[k].r&&a[k].r==d)
{
a[k].n=n;
return ;
}
mid=(a[k].l+a[k].r)/2;
if(d<=mid) xiugai(n,d,2*k);
else xiugai(n,d,2*k+1);
a[k].n=max(a[k*2].n,a[k*2+1].n);
}
int maxx;
void query(int l,int r,int k)
{
int mid;
if(a[k].l==l&&a[k].r==r)
{
maxx=max(maxx,a[k].n);
return ;
}
mid=(a[k].l+a[k].r)/2;
if(r<=mid) query(l,r,2*k);
else if(l>mid) query(l,r,2*k+1);
else
{
query(l,mid,2*k);
query(mid+1,r,2*k+1);
}
}
int main()
{
int t,n,m,i;
char c;
while(~scanf("%d%d",&n,&t))
{ build(1,n,1);
for(i=1;i<=n;i++)
{
scanf("%d",&m);
insert(m,i,1);
}
int a,b;
while(scanf("%c",&c))
{
maxx=0;
scanf("%d%d",&a,&b);
if(c=='Q')
{
query(a,b,1);
printf("%d\n",maxx);
}
else if(c=='U')
{
xiugai(b,a,1);
}
}
}
return 0;
}
与下面的AC代码就可以明显看出区别了:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N=200000+10;
struct node
{
int l,r,n;
} a[N<<2];
void build(int l,int r,int k)
{
int mid;
if(l==r)
{
a[k].l=a[k].r=l;
a[k].n=0;
return ;
}
mid=(l+r)/2;
a[k].l=l,a[k].r=r;
build(l,mid,2*k),build(mid+1,r,2*k+1);
}
void update(int d,int n,int k)
{
int mid;
if(a[k].l==a[k].r&&a[k].l==d)
{
a[k].n=n;
return ;
}
mid=(a[k].l+a[k].r)/2;
if(d<=mid) update(d,n,2*k);
else if(d>mid) update(d,n,2*k+1);
a[k].n=max(a[k*2].n,a[k*2+1].n);
}
int maxn;
void query(int l,int r,int k)
{
int mid;
if(a[k].l==l&&a[k].r==r)
{
maxn=max(a[k].n,maxn);
return ;
}
mid=(a[k].l+a[k].r)/2;
if(r<=mid) query(l,r,2*k);
else if(l>mid) query(l,r,2*k+1);
else
{
query(l,mid,2*k);
query(mid+1,r,2*k+1);
}
}
int main()
{
int n,m,x,i;
char s;
while(~scanf("%d%d",&n,&m))
{
memset(a,0,sizeof(a));
build(1,n,1);
for(i=1; i<=n; i++)
{
scanf("%d",&x);
update(i,x,1);
}
int a,b;
while(m--)
{
getchar();
scanf("%c%d%d",&s,&a,&b);
if(s=='U')
update(a,b,1);
else
{
maxn=0;
query(a,b,1);
printf("%d\n",maxn);
}
}
}
return 0;
}
都是出自自己的手,只不过创作时间不同,然而熟练与否一眼便可知晓;
HDU1754-I Hate It,线段数水题~~2016.4.11的更多相关文章
- POJ 3468 A Simple Problem with Integers(线段树水题)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 135904 ...
- hdu 1754 I Hate It(线段树水题)
>>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...
- HDU1166-敌兵布阵,线段数模板题~~
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 【wikioi】1191 数轴染色(线段树+水题)
http://wikioi.com/problem/1191/ 太水的线段树了,敲了10分钟就敲完了,但是听说还有一种并查集的做法?不明觉厉. #include <cstdio> #inc ...
- codeforces 339C Xenia and Bit Operations(线段树水题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Xenia and Bit Operations Xenia the beginn ...
- P1198 最大数 线段树水题
这道题模拟一下可以过,但是我们发现线段树也可以安全水过...... 写的线段树只需要滋磁单点修改,区间求max即可 我一开始犯了一个很SB的错误:每次插入修改了t,然后疯狂爆0到怀疑人生... 而且我 ...
- hdu - 1394 Minimum Inversion Number(线段树水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...
- hdu 1999 不可摸数 水题。
不可摸数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- CCF 201312-1 出现次数最多的数 (水题)
问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n ...
随机推荐
- 74LVC2G241双缓冲3态驱动器
- 浅析 Spark Shuffle 内存使用
在使用 Spark 进行计算时,我们经常会碰到作业 (Job) Out Of Memory(OOM) 的情况,而且很大一部分情况是发生在 Shuffle 阶段.那么在 Spark Shuffle 中具 ...
- #219. 【NOI2016】优秀的拆分
如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A=aabA=aab ...
- NestedScrollView嵌套RecycleView发生的小问题
1.解决方法:嵌套滑动不激活. recycleView.setNestedScrollingEnable(false); 这样做有个弊端,RecycleView的item会一次性加载完,不管是否显示, ...
- Android利用已有控件实现自定义控件
Android控件的基本介绍及使用自定义控件的意义 Android 本身提供了很多控件,自定义控件在android中被广泛运用,自定义控件给了我们很大的方便.比如说,一个视图为imag ...
- 移动端超级好用的reset.css(只做参考哦具体以你们实际项目需求为准)
html { color: #333; /*规定主色调,依据业务场景(非必须)*/ background: #F6F6F6; /*规定主背景,依据业务场景(非必须)*/ overflow-y: aut ...
- PHP一句话后门过狗姿势万千之后门构造与隐藏
第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础: ...
- Android(java)学习笔记168:Activity 4 种启动模式
1. 任务栈(task stack): 任务栈 是用来记录用户操作的行为,维护一个用户体验. 一个应用程序一般都是由多个activity组成的. 任务栈(task stack)记录存放用户开启的act ...
- luogu 3004 宝箱
题目游戏的加强版,建议先去A掉(双倍经验),数据范围比较大,所以我们不能想原来那样开二维数组来储存,所以我们必须压维,现在我们重新定义状态,一维数组dp[i]表示以i开头的最优拿法. 做法:枚举每一种 ...
- hdu5279 YJC plays Minecraft
题目描述 题解: 岛屿之间的边砍/不砍情况有$2^n$种, 但是需要剪掉所有的岛上都首尾相连的情况. $dp$一下对于完全图没有限制($f$)/有限制($g$)的情况数. 方程:$$f[i]=\sum ...