[SDOI2010]外星千足虫 题解 高斯消元+bitset简介
生活随笔
收集整理的這篇文章主要介紹了
[SDOI2010]外星千足虫 题解 高斯消元+bitset简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
高斯消元 + bitset 簡介:
高斯消元其實就是以加減消元為核心求唯一解。這道題還是比較裸的,可以快速判斷出來。我們將每一只蟲子看作一個未知數,這樣根據它給出的 m 組方程我們可以高斯消元得出每一只蟲子的歸屬地。如果你還不清楚高斯消元的原理可以移步此處
如果你只是以為這是一道板子題自信提交,那么恭喜你,你將會獲得TLE的好成績。為什么呢?我們知道高斯消元是 \(n^3\) 復雜度的,而本題數據范圍 $ n \leq 1000\(,\) m \leq 2000$,明顯會卡出TLE。
于是乎,bitset登場了,先介紹一下:
bitset是一種專門用來儲存二進制的數組,使用前要先調用函數庫。
他的每一個元素只占 1 bit空間,你可以將它當作bool類型的高精度。
他的優點很多,你可將他整體使用,也可單個訪問,例如:
bitset<4> a (string("1001")); bitset<4> b (string("0011")); //注:bitset后面那對尖括號里的數表示a數組的大小 a+=b; //此時a數組為1100 a[3]=1; a[1]=0; //此時a數組為1001你不訪問它單個的值是,bitset的運算就像一個普通的整數一樣,可以進行與(&)、或(|)、異或(^)、左移(<<)、右移(>>)等操作。同時你還可以對這個數里的任意一位賦值修改。
這樣我們就可以將高斯消元降為二維,將每一個方程用一個bitset維護,在用異或運算進行消元即可。
代碼如下:
#include<iostream> #include<cstdio> #include<iomanip> #include<algorithm> #include<bitset>//調用bitset函數庫#define ll long long #define db double #define inf 0x7fffffffusing namespace std;bitset<1005> s[2001]; int n,m,ans,now=1;inline int qr(){//快讀char ch;while((ch=getchar())<'0'||ch>'9');int res=ch^48;while((ch=getchar())>='0'&&ch<='9')res=(res<<1)+(res<<3)+(ch^48);return res; }inline int rd(){char ch;while((ch=getchar())<'0'||ch>'9');return ch^48;//每次只讀一個 }int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=qr()+1,m=qr();for(int i=1;i<=m;++i)//讀入for(int j=1;j<=n;++j)s[i][j]=rd();for(int i=1;i<n;now=++i){while(!s[now][i]&&now<=m)++now;ans=max(ans,now);//更新 k 值if(now==m+1){printf("Cannot Determine\n");return 0;} //方程不構成唯一解if(now!=i)swap(s[i],s[now]);for(int j=1;j<=m;j++){if(i==j)continue; //不消自己if(!s[j][i])continue;//不是1就不用消s[j]^=s[i];//用異或消去系數 1}//消去其他方程的系數}printf("%d\n",ans);for(int i=1;i<n;++i)if(s[i][n])printf("?y7M#\n");else printf("Earth\n");return 0; }bitset除了可以整體運算外還有很多功能:
foo.size() 返回大小(位數) foo.count() 返回1的個數 foo.any() 返回是否有1 foo.none() 返回是否沒有1 foo.set() 全都變成1 foo.set(p) 將第p + 1位變成1 foo.set(p, x) 將第p + 1位變成x foo.reset() 全都變成0 foo.reset(p) 將第p + 1位變成0 foo.flip() 全都取反 foo.flip(p) 將第p + 1位取反 foo.to_ulong() 返回它轉換為unsigned long的結果,如果超出范圍則報錯 foo.to_ullong() 返回它轉換為unsigned long long的結果,如果超出范圍則報錯 foo.to_string() 返回它轉換為string的結果轉載于:https://www.cnblogs.com/812-xiao-wen/p/9872897.html
總結
以上是生活随笔為你收集整理的[SDOI2010]外星千足虫 题解 高斯消元+bitset简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1. ELK 之elasticsearc
- 下一篇: 相比传统游戏,区块链游戏的价值在哪里?