1問題:
允許兩個操作,add(min,max)和del(min,max),一開始區間內為空,每個操作後算出區間內的集合,要求能自動合併、拆分集合。例如:2.思路操作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
stop
比如add 1 7
(1,7)
del 3 5
(1,2)、(6,7)
stop
程式結束
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 則輸出...