區間操作練習

2021-07-09 13:15:24 字數 1926 閱讀 5048

1問題:

允許兩個操作,add(min,max)和del(min,max),一開始區間內為空,每個操作後算出區間內的集合,要求能自動合併、拆分集合。例如:

操作1:add(1,7)   區間內的集合:(1,7)

操作2:add(9,10)  區間內的集合:(1,7)、(9,10)

操作3:del(3,5)   區間內的集合:(1,2)、(6,7)、(9,10)

操作4:add(3,8)   區間內的集合:(1,10)

整個區間的範圍可能會在(0,2^32-1)之間。

要求給出add()和del()的演算法描述和**實現,程式要實現輸入輸出即可供使用者操作,實現對應命令,統一確定輸出命令的格式為

add number1 number2

del number1 number2

print

stop

比如add 1 7

print

(1,7)

del 3 5

print

(1,2)、(6,7)

stop

程式結束

2.思路

1.因為範圍是0到2^32-1,因此直接用int加資料結構來表示區間,至少要用到4*2^32byte的記憶體空間也就是16g,明顯不能這麼做

2.在想這是區間操作,又是連續的,區間只有兩種狀態,一種為空,一種為存在,恰好對應乙個位的兩種狀態,這樣就自然而然的想到了用位圖的方法,可以

3.既然想到用位圖了,就比較好做了,一切水到渠成,首先定義幾個位操作的巨集函式,然後定義區間操作的巨集函式,然後在這個基礎上用函式加一些包裹

3.**如下

#include #include #include #include //思路用位進行操作,每一位代表乙個整數

#define len_8 536870912 //2^32/8

#define len_32 134217728

#define max 4294967295 //2^32-1

#define mask 0x1f //5個1

unsigned int s[len_32]=;

#define set_bit_false(num) s[num>>5]=s[num>>5]&~(1<<(num&31))

#define set_bit_true(num) s[num>>5]=(s[num>>5])|(1<<(num&31))

#define bit_is_true(num) s[num>>5]&(1<<(num&31))

#define hash_bit_true(num1,num2) while(num1<=num2)

#define hash_bit_false(num1,num2) while(num1<=num2)

void str_aly(char *s,char*fuc,unsigned int* num1,unsigned int* num2);

void add(unsigned int num1,unsigned int num2)

void del(unsigned int num1,unsigned int num2)

void print(unsigned int input_max)

else if(bit_is_true(num)&&flag)

else if(!(bit_is_true(num))&&flag)

index1=index2=0;

}num++;

}printf("\n");

}void stop()

int main()

; while(1)

printf("請輸入資料\n\t");

gets(s);

str_aly(s,fuc,&num1,&num2);

if(input_max

區間DP練習

部落格 lightoj 1422 int dp 105 105 a 105 dp i j i 到 j 最小穿多少衣服 int main printf d n dp 1 n return 0 poj2955括號匹配 int dp 105 105 a 105 dp i j i 到 j 匹配了多少括號。i...

splay區間操作

splaytree 區間操作 區間修改 題目 題目大意 給出一組數字,區間整體增加乙個值,區間查詢和 思路 很經典的區間操作的題目,因此思路也不用自己想,都是各路以例題的形式給出 之前用線段數寫的,用了 1938ms 今天用 splay 寫,耗時 2875.說一下splay 操作的幾個要點 其實核心...

演算法練習 重疊區間個數

一 題目描述 給定多個可能重疊的區間,找出重疊區間的個數。舉例如下 輸入 1,5 10 15 5 10 20 30 輸出 2 說明 題意應該是找出重疊區間中區間的最大個數,當沒有區間重疊時,重疊個數最大為1 比如 輸入為 1,5 10 15 則輸出為1 輸入為 1,2 2,3 3,4 4,5 則輸出...