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 ...
随机推荐
- 482 License Key Formatting 注册码格式化
详见:https://leetcode.com/problems/license-key-formatting/description/ C++: class Solution { public: s ...
- pkill 和 pgrep总结
查看进程ID和方便kill进程 pgrep -d 指定分隔符 pgrep -d ' ' -u root 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 -u p ...
- neo4j(图数据库)是什么?
不多说,直接上干货! 作为一款强健的,可伸缩的高性能数据库,Neo4j最适合完整的企业部署或者用于一个轻量级项目中完整服务器的一个子集存在. 它包括如下几个显著特点: 完整的ACID支持 高可用性 轻 ...
- AJPFX关于StringBuffer,StringBuilder类 总结(一)
StringBuffer,StringBuilder类 StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高 StringBuffer:概述1) ...
- synchronize早已经没那么笨重
我发现一些同学在网络上有看不少synchronize的文章,可能有些同学没深入了解,只看了部分内容,就急急忙忙认为不能使用它,很笨重,因为是采用操作系统同步互斥信号量来实现的.关于这类的对于synch ...
- Linux系统结构与终端控制台
Linux系统结构与终端控制台 作者:Vashon 时间:20150418 以下主要是对Linux系统终端控制台切换及基本操作的范例,其他的理论就不多说了,直接进入实践部分. Starting.... ...
- 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志
来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...
- ES5函数新增的方法(call、apply、bind)
1.call()的使用<script type="text/javascript"> var obj1 = { name:'bob', fn:function(){ c ...
- log4j 日志分级处理
log4j 配置文件: log4j.rootLogger=debug,stdout,debug,info,errorlog4j.appender.stdout=org.apache.log4j.Con ...
- [Python學習筆記] 利用 Python在Excel 插入註解
用Python 來處理excel 檔 用過了 openpyxl 還有 pyexcel目前覺得除了讀寫如果還要使用另外的功能 (像是讀取格子裡的公式)可以用 xlwings 他的首頁標題 " ...