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 ...
随机推荐
- pyinstaller 打包.exe文件记录遇到的问题
用pyinstaller打包py2.7的程序有时会出现不匹配的错误,在python的idle下运行没有问题,打包之后却会报一些错误,所以打包的话还是尽量用py3.5版本,而且用 -F 将程序打包成一个 ...
- MVC模式到传统风格的Spring MVC
现在我们要做个简单的基于servlet的MVC的模型,我们要有一个Product要从表单处获取. MVC中的M是模型,V是视图,C是控制器.视图负责应用的展示,模型封装了数据和业务逻辑,控制器负责接收 ...
- Java异常概念
- CentOS 7.2安装pip
CentOS 7.2默认安装的python版本为python2.7.5,我的系统里面默认是没有安装pip 的,搜了下网上各路大侠的解决办法,如下: 使用yum安装python-pip,但是报错,说没有 ...
- Centos系统安装 phpredis 扩展
Git地址:https://github.com/nicolasff/phpredis 一.安装: phpize ./configure make && make install 其中 ...
- Day01 计算机硬件基础
1.什么是编程语言? 编程语言是程序员与计算机沟通的介质. 2.什么是编程? 程序员利用某种编程语言的语法格式将自己脑子中想要让计算机做的事写到文件中. 所以说,变成的结果就是文件,文件的内容就是一堆 ...
- iphone x 高度:100%; 兼容设置
问题: iphone x 会遇到页面设置 height:100%;之后但是底部还有一定的高度没有覆盖 解决方法: 1.让客户端设置webview的高度为100%; 2.html代码里面添加 viewp ...
- git 配置免密上传,配置ssh key
1.windows 打开git bash 控制台,linux 直接打开命令控制台,输入 ssh-keygen 一直enter 下一步 2.生成的文件windows 存放在c://users 路径下,l ...
- qt qtableview 样式设置
转载请注明出处:http://www.cnblogs.com/dachen408/p/7531159.html 1.设置tableview的列宽时,必须先setModel再setColumnWidge ...
- [Python筆記] 將 Pandas 的 Dataframe 寫入 Sqlite3
使用 pandas.io 寫入 Sqlite import sqlite3 as lite from pandas.io import sql import pandas as pd 依照 if_ex ...