【HDU 1754】びっくり!max()着信時関数がタイムアウトしました.
1447 ワード
ソースリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1754
この問題は裸の線分樹の区間の一番の値+単点の修正ですが、巨大な穴があります.
acコード:
この問題は裸の線分樹の区間の一番の値+単点の修正ですが、巨大な穴があります.
return max(cnt,query(i/2,j/2)); //
:
int q=query(i/2,j/2);
return cnt>q?cnt:q; //AC
なぜですか?max()はマクロ定義なので、#define max(x1, y1) ((x1) > (y1) ? (x1) : (y1))
元のコードの展開後: cnt>query(i/2,j/2) ? cnt : query(i/2,j/2);
クエリー関数は2回実行されます.acコード:
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int tree[200000*4];
void updata(int i,int num){
tree[i]=num;
i/=2;
while(i>=1){
tree[i]=tree[i*2]>tree[i*2+1]?tree[i*2]:tree[i*2+1];
i/=2;
}
}
int query(int i,int j){
if (j-i==1) return max(tree[i],tree[j]);
if (j==i) return tree[i];
int cnt=0;
if (i%2!=0){
cnt=tree[i];
i++;
}
if (j%2==0){
if (cntq?cnt:q;
}
int main()
{
int n,m,N,a,x,y;
char c;
while(~scanf("%d%d",&n,&m)){
memset(tree,0,sizeof(tree));
N=1;
while(N