好久沒寫部落格了呢...
自上篇部落格以來就做了一件事——ccpc秦皇島打鐵..
(涼涼...
bitset介紹:bitset 是stl庫中的二進位制容器,bitset可以看作bool陣列,但優化了空間複雜度和時間複雜度,並且可以像整型一樣按位與或。
bitset的標頭檔案:#include
bitset的申明要指明長度:bitsetbi
bitset過載了運算子,故可以像bool陣列那樣賦值:bi[2]=1
建構函式
bitsetb;
b有n位,每位都為0.引數n可以為乙個表示式.
如bitset<5> b0;則"b0"為"00000";
bitsetb(unsigned long u);
b有n位,並用u賦值;如果u超過n位,則頂端被截除
如:bitset<5>b0(5);則"b0"為"00101";
bitsetb(string s);
b是string物件s中含有的位串的副本
string bitval ( "10011" );
bitset<5> b0 ( bitval4 );
則"b0"為"10011";
bitsetb(s, pos);
b是s中從位置pos開始位的副本,前面的多餘位自動填充0;
string bitval ("01011010");
bitset<10> b0 ( bitval5, 3 );
則"b0" 為 "0000011010";
bitsetb(s, pos, num);
b是s中從位置pos開始的num個位的副本,如果num
string bitval ("11110011011");
bitset<6> b0 ( bitval5, 3, 6 );
則"b0" 為 "100110";
常用函式:
b1 = b2 & b3;//按位與
b1 = b2 | b3;//按位或
b1 = b2 ^ b3;//按位異或
b1 = ~b2;//按位補
b1 = b2 << 3;//移位
int one = b1.count();//統計1的個數
成員函式
函式功能
bs.any()
是否存在值為1的二進位制位
bs.none()
是否不存在值為1的二進位制位
或者說是否全部位為0
bs.size()
位長,也即是非模板引數值
bs.count()
值為1的個數
bs.test(pos)
測試pos處的二進位制位是否為1
與0做或運算
bs.set()
全部位置1
bs.set(pos)
pos位處的二進位制位置1
與1做或運算
bs.reset()
全部位置0
bs.reset(pos)
pos位處的二進位制位置0
與0做或運算
bs.flip()
全部位逐位取反
bs.flip(pos)
pos處的二進位制位取反
bs.to_ulong()
將二進位制轉換為unsigned long輸出
bs.to_string()
將二進位制轉換為字串輸出
~bs按位取反
效果等效為bs.flip()
os << b
將二進位制位輸出到os流
小值在右,大值在左
51nod1573 美麗的集合
多重集合是數學中的乙個概念,是集合概念的推廣。在乙個集合中,相同的元素只能出現一次,因此只能顯示出有或無的屬性。在多重集之中,同乙個元素可以出現多次。
我們現在有n個多重集合,第i個集合最開始都有乙個元素ai(1≤i≤n)。
乙個擁有n個元素的多重集合顯然會有2^n個子集。
乙個多重集合的價值為子集中不同的和的個數。
例如乙個多重集合,那麼會存在有4個不同的和。其價值為4。
乙個多重集合,那麼會有3個不同的和,其價值為3。
現在我們有兩種操作:
1、合併最開始時多重集合i現在所在的多重集合與多重集合j現在所在的多重集合,成為乙個新的多重集合。
2、詢問最開始多重集合i現在所在多重集合的價值。
資料保證合併兩個最開始時的多重集合所在的多重集合時它們當前不是同乙個多重集合。
樣例解釋:
第乙個查詢的多重集合為,價值為2
第二個查詢的多重集合為,價值為3
第三個查詢的多重集合為,價值為4
input
第一行乙個數n,表示有n個多重集合。(1<=n<=1000)
第二行n個數ai。(σai<=100000,ai>0)
第三行乙個數q,表示操作個數。(1<=q<=2000)
接下來q行,一開始讀入乙個數a,表示操作a。
若a為1,接下來讀入兩個數i和j,表示合併操作(1<=i,j<=n)。
若a為2,接下來讀入乙個數i,表示查詢操作(1<=i<=n)。
output
對於所有a=2的操作,輸出相應的答案。
input示例
5 1 1 2 4 5
5 2 1
1 1 2
2 2
1 3 4
2 3
output示例
2 3
4思路:第一次用bitset(使用者體驗++),感覺就是一串很長的bool,用來存01異或比較快。然後要用並查集處理一下集合,合併合併就好叻~
(**注釋超清楚的 自豪臉.jpg)
#include#include#include#includeusing namespace std;
bitset<100005> bit[2005];
vectorv[2005];
int f[2005];
int find(int x)
void unit(int x,int y)
{ x=find(x),y=find(y);
if(x==y) return;
if(v[y].size()>v[x].size())//使得x是大的值
swap(x,y);
for(int i=v[y].size()-1;i>=0;i--)
{v[x].push_back(v[y][i]);//把小集合裡的值推入大集合裡
bit[x]|=bit[x]<
51nod 1573 分解 矩陣快速冪
51nod 演算法馬拉松17 告別奧運 b 分解 51nod 演算法馬拉松17 告別奧運 b 分解 題意 給出乙個 n 問 1 2 n能否拆成m m 1 的形式,如果能,輸出 m 否則輸出 no。想法觀察 1 2 n,它總能寫成a b2 的形式,如果a2 n m,2 b2 n m 1 或者a2 n ...
51nod 貪心入門
有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...
51nod 迷宮問題
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...