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 9 Hint Huge 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 ...
随机推荐
- html5 input 标签
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...
- 关于IE 对 $.get 缓存的记录
最近在IE9中碰到一个问题是, 当我对某个角色进行修改的时候,再点击查询还是修改之前的内容,但是实际数据库已经修改成功,纠结了好一会儿之后,才发现是 $.get请求的问题. 因为 IE对get请求, ...
- vue中引入字体图标报错,找不到字体文件
在用vue + webpack进行开发的时候,在引用字体图标遇到字体无法加载的问题: 报以下错误 搞了好久没搞定,最后才找到解决方法(还是没有找到原因) 修改字体图标的css中引入字体文件的路径 以前 ...
- What is Scalability?
Scalability is a system's ability to process more workload, with a proportional increase in system r ...
- 用JS检测页面加载的不同阶段状态
这可以通过用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == “complete”判断是否加载完成. 可以采用2个div ...
- Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用
1.Spring与Mybatis整合 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web ...
- android开发中设置字体
转自:http://segmentfault.com/q/1010000000494116 http://ryanhoo.github.io/blog/2014/05/05/android-bette ...
- hdu 2192 MagicBuilding
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- svn批处理语句
sc create SVNService binpath="O:\ProgramingSoftware\SuiVersion\bin\svnserve.exe --service -r E: ...
- 原生查找DOM的方法
JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...