暑假集訓每日一題0711 (線段樹)

2022-03-06 20:24:17 字數 1564 閱讀 5379

維護乙個整數序列,支援以下操作:

1 x v : 將第x個整數的值修改為v;

2 x y : 查詢區間[x,y]之間的最小值;

3 x y : 查詢區間[x,y]之間的最大值;

4 x y : 查詢區間[x,y]內的整數和。

資料保證查詢結果均在int範圍之內,但中間結果是否可能溢位呢?我交的程式沒考慮這個也ac了。

通過這題還發現乙個奇怪的現象,用memset初始化的程式跑了2s多,而用for迴圈初始化的程式才跑468ms……

for迴圈初始化(468ms)

#include #include 

#define min(a,b) ((a)

#define max(a,b) ((a)>(b)?(a):(b))

#define inf 0x7fffffff

#define n 100010

intd,n;

int v[n],min[4*n],max[4*n],sum[4*n];

void

init()

for(d=1;d2;d<<=1

);

for(i=1;i<=n;i++)

for(i=d-1;i^1;i--)

}void update(int k,intv)}

void getmin(int x,int

y) printf(

"%d\n

",ret);

}void getmax(int x,int

y) printf(

"%d\n

",ret);

}void getsum(int x,int

y) printf(

"%d\n

",ret);

}int

main()}}

return0;

}

memset初始化(2s多)

#include #include 

#define min(a,b) ((a)

#define max(a,b) ((a)>(b)?(a):(b))

#define inf 0x7fffffff

#define n 100010

intd,n;

int v[n],min[4*n],max[4*n],sum[4*n];

void

init()

for(i=d-1;i^1;i--)

}void update(int k,intv)}

void getmin(int x,int

y) printf(

"%d\n

",ret);

}void getmax(int x,int

y) printf(

"%d\n

",ret);

}void getsum(int x,int

y) printf(

"%d\n

",ret);

}int

main()}}

return0;

}

暑假集訓每日一題0712 (線段樹)

維護乙個只有0和1的整數序列,支援以下操作 1 x y v 將區間 x,y 之間的所有整數都變為v v為0或1 2 x y 將區間 x,y 之間所有的1變為0,所有的0變為1 3 x y 查詢區間 x,y 內的1的個數。線段數練習 每段儲存3個關鍵資訊 和,修改標記,反轉標記。需注意的幾點 在更新某...

暑假集訓每日一題0713(字典樹)

給出n個長度不超過5000的只含數字的字串,你需要回答m次形如i j的詢問,對於每次詢問用一行輸出乙個整數表示第i個字串和第j個字元的最長公共字首的長度。比如兩個字串分別為201212和201112,2 20 和 201 都是它們的公共字首,但最長的公共字首是 201 於是就應當輸出3。輸入包含多組...

暑假集訓每日一題0717(DFS)

這題是zoj 1008那題。給你n n個方塊,每個方塊被對角線劃分為4部分,每一部分裡面有乙個數字,問能否將方塊拼成乙個邊長為n的大方塊,使得相鄰方塊的相鄰數字相同。用dfs搜尋,需要剪枝,同一層中相同方塊只搜尋一次。view code include include define n 26 def...