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 ...
随机推荐
- 利用uiautomator实现Android移动app启动时间的测试
为了减少因手工测试的反应误差,这里介绍下如何利用Android自带的自动化测试工具uiautomator实现app启动时间的测试. 测试基本思路如下: 1.启动前记录当前的时间戳 2.启动app,直至 ...
- 2. UITest相关APIs
1. XCUIApplication 这是你正在测试的应用的代理.它能让你启动应用,这样你就能执行测试了.它每次都会新起一个进程,这会多花一些时间,但是能保证测试应用时的状态是干净的,这样你需要处理的 ...
- 基于socketserver实现的并发(tcp和udp)
threading 线程 基于tcp协议:请求建立连接,然后开启进程 基于udp协议:直接开启新进程 基于tcp协议 import socketserver # 导入socketserver模块 # ...
- mySQL 从删库到跑路
问题: 使用python实现load data infile ...向mySQL中导入数据.虽然成功执行但是数据库中没增加记录. 解决: zz的我execute之后没有commit.
- CF778B(round 402 div.2 E) Bitwise Formula
题意: Bob recently read about bitwise operations used in computers: AND, OR and XOR. He have studied t ...
- 字符串、数组、json
一.字符串 string 1.字符串的定义: (1).var s="haha"; (2).var s=new string ("hello") 对象形式定义 2 ...
- 【学习笔记】二:在HTML中使用JavaScript
1.<script>标签 1)考虑到最大限度的浏览器兼容性和约定俗成,type属性使用:text/javascript. 2)标签建议放置到</body>标签前,提高用户体验( ...
- chrome inspect出现白屏的解决方案
点inspect后 弹出框,可是里面一片白色 PS:原效果不是这样,只是图找不到随便p的 原因可以看这个:http://www.cnblogs.com/slmk/p/7591126.html 大概意思 ...
- https为数据传输保驾护航
为什么要使用https 谷歌官网已宣布,今年7月起,Chrome浏览器的地址栏将把所有HTTP标示为不安全网站. 在客户端与服务器数据传输过程中,http协议传输是不安全的,一般情况下,http协议的 ...
- 介绍三款大前端UI框架
一.蚂蚁金服团队推出的基于React antd (全名:ant.design) 友情跳链:https://ant.design/index-cn:使用antd模板:https://pro.ant.de ...