對於某些資料範圍很大,但是分布卻非常稀疏的題目,直接用陣列存非常浪費空間,而且很可能會炸,於是要用到離散化這樣的技巧;
其實這名字似乎很高大上,演算法實現並不難,只是對資料排個序,去重,然後在其餘**部分用這個數的編號代替這個數就可以了;
實現排序和去重起來有很多種方法,用stl會更簡單一些;
方法一:vector
輸出:資料及其對應編號
1 #include2 #include3 #include4using
namespace
std;
5const
int maxn=;
6int
n;7 vectora;
8int
main()917
sort(a.begin(),a.end());
18 a.resize(unique(a.begin(),a.end())-a.begin());
19for(int i=0;i"
%d %d\n
",a[i],i);
20return0;
21 }
方法二:set
只能輸出排序後、按公升序排列的資料,如果非要輸出編號需要過載運算子……懶得寫了
1 #include2 #include3 #include4using
namespace
std;
5const
int maxn=110;6
intn;
7set
a;8int
main()917
set::iterator iter;
18for(iter=a.begin();iter!=a.end();++iter)printf("
%d\n
",*iter);
19return0;
20 }
在排序、去重之後,需要將編號對映到數,可以手寫陣列,也可以用map
git 奇技淫巧
例如 1.0.0 git tag a 1.0.0 m 1.0.0 版本的備註資訊.複製 git push origin tags 複製 例如 1.0.0 git tag d 1.0.0 複製 刪除遠端標籤需要先刪除本地標籤,再執行下面的命令 git push origin refs tags 1.0...
C 之奇技淫巧
typedef struct data 0 pdata 0 typedef struct data 1 pdata 1 結構體data 0與data 1在性質上沒有什麼不同,它們的size是相等的,都是8.但在用法上有很大區別。例 pdata 0 stack0 pdata 0 malloc max ...
c 的奇技淫巧
關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...