hdu1754 i hate it(题解)
来源:互联网 发布:淘宝代装修 编辑:程序博客网 时间:2024/05/17 01:11
这道题果然是i hate it,虽然是线段树的最最基础题,但我tle了30,40发,debug一个月多才知道tle在哪里。
由于我是用纯C写的,没有c++中max函数,我就自己用预处理宏,写了一个,对,tle就在这里,如果你是用c++里面的max就ac了。
我tle的代码(把复杂函数扔进预处理宏纯粹是作死!!!!)
#include <stdio.h>#define mMax(X,Y) ((X)>(Y)?(X):(Y))int tree[800011],N;void build(int tn,int left,int right){ int mid; if(left==right) {scanf("%d",tree+tn);return;} mid=(left+right)>>1; build(tn<<1,left,mid); build(tn<<1|1,mid+1,right); tree[tn]=mMax(tree[tn<<1],tree[tn<<1|1]);}void chang(int tn,int left,int right,int x,int num){ int mid; if(left==right) {tree[tn]=num;return; } mid=(left+right)>>1; if(x<=mid) chang(tn<<1,left,mid,x,num); else chang(tn<<1|1,mid+1,right,x,num); tree[tn]=mMax(tree[tn<<1],tree[tn<<1|1]);}int find(int tn,int left,int right,int x,int y){ int mid,sum=0; if(x<=left&&right<=y) return tree[tn]; mid=(left+right)>>1; if(x<=mid) sum=mMax(sum,find(tn<<1,left,mid,x,y)); if(y>mid) sum=mMax(sum,find(tn<<1|1,mid+1,right,x,y)); return sum;}int main(int argc, char const *argv[]){ int M,a,b; char str[5]; while(scanf("%d %d",&N,&M)==2) { build(1,1,N); while(M--) { scanf("%s %d %d",str,&a,&b); if(str[0]=='U') chang(1,1,N,a,b); else printf("%d\n",find(1,1,N,a,b) ); } } return 0;}
ac的代码,唯一区别就是我用了c++中的max。。。。。。生无可恋
#include <algorithm>#include <stdio.h>using namespace std;int tree[800011],N;void build(int tn,int left,int right){ int mid; if(left==right) {scanf("%d",tree+tn);return;} mid=(left+right)>>1; build(tn<<1,left,mid); build(tn<<1|1,mid+1,right); tree[tn]=max(tree[tn<<1],tree[tn<<1|1]);}void chang(int tn,int left,int right,int x,int num){ int mid; if(left==right) {tree[tn]=num;return; } mid=(left+right)>>1; if(x<=mid) chang(tn<<1,left,mid,x,num); else chang(tn<<1|1,mid+1,right,x,num); tree[tn]=max(tree[tn<<1],tree[tn<<1|1]);}int find(int tn,int left,int right,int x,int y){ int mid,sum=0; if(x<=left&&right<=y) return tree[tn]; mid=(left+right)>>1; if(x<=mid) sum=max(sum,find(tn<<1,left,mid,x,y)); if(y>mid) sum=max(sum,find(tn<<1|1,mid+1,right,x,y)); return sum;}int main(int argc, char const *argv[]){ int M,a,b; char str[5]; while(scanf("%d %d",&N,&M)==2) { build(1,1,N); while(M--) { scanf("%s %d %d",str,&a,&b); if(str[0]=='U') chang(1,1,N,a,b); else printf("%d\n",find(1,1,N,a,b) ); } } return 0;}
0 0
- hdu1754 i hate it(题解)
- hdu1754 I Hate It
- HDU1754 I Hate It
- HDU1754:I Hate It
- HDU1754--I Hate It
- HDU1754 I hate it
- hdu1754 I Hate It
- HDU1754:I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate it
- HDU1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- HDU1754 I Hate It
- UESTC 491 Tricks in Bits (暴力回溯 + 剪枝)
- HDOJ 2457 DNA repair (AC自动机+DP)
- SpringMVC+Spring4.0+Hibernate 简单的整合
- HTTP请求报文和响应报文
- c++内存池实现
- hdu1754 i hate it(题解)
- 剑指Offer----面试题14:调整数组顺序使奇数位于偶数前面
- 2016年成功申请信用卡技巧指南
- Java并发包概览
- angular中compile和link函数详解
- PHP正则表达式
- css 定位模型和浮动总结
- java数据结构之线性队列的实现
- 大地测量学白塞尔大地主题解算