日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces 1344F Piet's Palette (线性代数、高斯消元)

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 1344F Piet's Palette (线性代数、高斯消元) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

https://codeforces.com/contest/1344/problem/F

題解

怎么又是神仙數學構造題。。
觀察題目中的操作,我們令

\[\textbf{A}_W=\begin{bmatrix}0\\0\end{bmatrix},\ \textbf{A}_R=\begin{bmatrix}1\\0\end{bmatrix},\ \textbf{A}_Y=\begin{bmatrix}0\\1\end{bmatrix},\ \textbf{A}_B=\begin{bmatrix}1\\1\end{bmatrix} \]

則可以發現,mix 操作就相當于把所有的這些向量在 \(\mod 2\) 意義下相加。
考慮交換操作,其實可以等價于左乘 \(2\times 2\) 的矩陣:

\[\textbf{B}_{RY}=\begin{bmatrix}0&1\\1&0\end{bmatrix},\ \textbf{B}_{YB}=\begin{bmatrix}1&1\\0&1\end{bmatrix},\ \textbf{B}_{RB}=\begin{bmatrix}1&0\\1&1\end{bmatrix} \]

于是這就成了一個 \(2n\) 個未知數 \(2m\) 個方程的異或方程組,高斯消元即可。
時間復雜度 \(O(\frac{n^3}{w})\)\(8\) 倍常數。

這種題大概看題解就兩分鐘的事,但是我這輩子大概都想不出來吧。。。

代碼

#include<bits/stdc++.h> #define llong long long #define mkpr make_pair #define x first #define y second #define iter iterator #define riter reversed_iterator #define y1 Lorem_ipsum_dolor using namespace std;inline int read() {int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f; }const int mxN = 1000; struct Matrix {int a[2][2];Matrix() {memset(a,0,sizeof(a));}Matrix operator *(const Matrix &arg) const{Matrix ret;for(int i=0; i<2; i++) for(int j=0; j<2; j++) for(int k=0; k<2; k++) {ret.a[i][j] ^= (a[i][k]&arg.a[k][j]);}return ret;} } I,A[4]; Matrix a[mxN+3]; int n,m;int decode(char x) {return x=='R'?1:(x=='Y'?2:(x=='B'?3:0));}namespace Gauss {bitset<mxN*2+3> a[mxN*2+3]; int pos[mxN*2+3],sol[mxN*2+3];int n,m;bool solve(){for(int i=1,j=1; i<=m&&j<=n; i++,j++){while(j<=n){bool found = false;for(int k=i; k<=m; k++) if(a[k][j]){swap(a[i],a[k]); found = true;break;}if(found) break;j++;}if(j>n) {break;}pos[i] = j;for(int k=i+1; k<=m; k++){if(a[k][j]) {a[k] ^= a[i];}}}for(int i=m; i>=1; i--) if(pos[i]){int tmp = a[i][n+1];for(int j=pos[i]+1; j<=n; j++){tmp ^= (a[i][j]&sol[j]);}sol[pos[i]] = tmp;}for(int i=1; i<=m; i++){int tmp = a[i][n+1];for(int j=pos[i]; j<=n; j++){tmp ^= (a[i][j]&sol[j]);}if(tmp) {return false;}}return true;} }int main() {I.a[0][0] = I.a[1][1] = A[3].a[0][1] = A[3].a[1][0] = A[1].a[0][0] = A[1].a[0][1] = A[1].a[1][1] = A[2].a[0][0] = A[2].a[1][0] = A[2].a[1][1] = 1;n = read(),m = read();for(int i=1; i<=n; i++) a[i] = I;Gauss::n = n*2;for(int i=1; i<=m; i++){char opt[7]; scanf("%s",opt);if(opt[0]=='m'){Gauss::m += 2;int cnt = read();while(cnt--){int x = read();Gauss::a[Gauss::m-1][2*x-1] = a[x].a[0][0];Gauss::a[Gauss::m-1][2*x] = a[x].a[0][1];Gauss::a[Gauss::m][2*x-1] = a[x].a[1][0];Gauss::a[Gauss::m][2*x] = a[x].a[1][1];}scanf("%s",opt); int c = decode(opt[0]);Gauss::a[Gauss::m-1][n+n+1] = c&1;Gauss::a[Gauss::m][n+n+1] = c>>1;}else{int c = decode(opt[0])^decode(opt[1]),cnt = read();while(cnt--){int x = read(); a[x] = A[c]*a[x];}}}if(!Gauss::solve()) {puts("NO");}else{puts("YES");for(int i=1; i<=n; i++){int x = (Gauss::sol[2*i]<<1)|Gauss::sol[2*i-1];printf("%c",x==0?'.':(x==1?'R':(x==2?'Y':'B')));}puts("");}return 0; }

總結

以上是生活随笔為你收集整理的Codeforces 1344F Piet's Palette (线性代数、高斯消元)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。