从做这几个题目我发现了,能调用库函数的尽量调用库函数,不然的话可能会超时。不信可以试,在题1的头文件下定义宏:
#define min(a,b) (a)<(b)?(a):(b)
在题2中定义宏:
#define max(a,b) (a)>(b)?(a):(b)
题1:Tyvj 1038(忠诚),给定区间求最小值。只需更改Query即可,由于没有修改操作,可以删除Update操作。
#include
#include
#include
#include
using namespace std;
const int MAX=100010;
const int Inf=100000000;
//#define min(a,b) (a)<(b)?(a):(b) 不要加这个,加后会超时
#define Lson L,mid,root<<1
#define Rson mid+1,R,root<<1|1
int n,m,Min[MAX<<2];
int Pushup(int root)
{ Min[root]=min(Min[root<<1],Min[root<<1|1]);
}
void Build(int L,int R,int root)
{ if(L==R)
{ scanf("%d",&Min[root]);
return ;
}
int mid=(L+R)>>1;
Build(Lson);
Build(Rson);
Pushup(root);
}
int Query(int ql,int qr,int L,int R,int root)
{ if(ql<=L && R<=qr) return Min[root];
int mid=(L+R)>>1;
int res=Inf;
if(ql<=mid) res=min(res,Query(ql,qr,Lson));
if(qr>mid) res=min(res,Query(ql,qr,Rson));
return res;
}
int main()
{ int a,b;
scanf("%d%d",&n,&m);
Build(1,n,1);
for(int i=0;i
例题2:HDU 1754(I hate it),给定区间求最大值,记得update中只是更新该结点的值。
#include
#include
#include
#include
using namespace std;
const int MAX=200010;
//#define max(a,b) (a)>(b)?(a):(b) 不要加这个,加后会超时
#define Lson L,mid,root<<1
#define Rson mid+1,R,root<<1|1
int n,m,Max[MAX<<2];
int Pushup(int root)
{ Max[root]=max(Max[root<<1],Max[root<<1|1]);
}
void Build(int L,int R,int root)
{ if(L==R)
{ scanf("%d",&Max[root]);
return ;
}
int mid=(L+R)>>1;
Build(Lson);
Build(Rson);
Pushup(root);
}
void Update(int q,int val,int L,int R,int root)
{ if(L==R)
{ Max[root]=val;
return ;
}
int mid=(L+R)>>1;
if(q<=mid) Update(q,val,Lson);
else Update(q,val,Rson);
Pushup(root);
}
int Query(int ql,int qr,int L,int R,int root)
{ if(ql<=L && R<=qr) return Max[root];
int mid=(L+R)>>1;
int res=0;
if(ql<=mid) res=max(res,Query(ql,qr,Lson));
if(qr>mid) res=max(res,Query(ql,qr,Rson));
return res;
}
int main()
{ int a,b;
while(~scanf("%d%d",&n,&m))
{ Build(1,n,1);
char op[5];
getchar();
while(m--)
{ scanf("%s%d%d",op,&a,&b);
if(op[0]=='U') Update(a,b,1,n,1);
if(op[0]=='Q') printf("%d\n",Query(a,b,1,n,1));
}
}
return 0;
}