蒟蒻的ACM演算法 三 線性基

2021-09-30 19:03:18 字數 3976 閱讀 8221

常見題目

二.小a與星際探索

即使線性代數課結束,依然逃不過線性代數

線性基,類似於線代裡面的矩陣求最大線性無關組.

看一下大佬的說法:鏘鏘,傳送門%%%%

首先來看乙個問題: 給出n個數,要從中選出乙個最大的子集,使得子集中的任意個元素異或值不為0.

這個和極大線性無關組有些類似。異或可以看出是模2域下的加法運算,如果把乙個數轉化為二進位制,對應成乙個由01構成的向量,

所有這些向量就構成了乙個線性空間。 原問題就轉化為求這個向量組的極大線性無關組,把這樣乙個極大線性無關組成為線性基。

可以用o(6060n)的高斯消元來解決。 但是還有更加快速的構造線性基的方法: 複雜度是o(60*n)

可以這麼看,我們有n多個數.這些數x相互xor(異或)得到的一些數y,我們稱y是他們x的值域.但是n多個數可能都太大,不好維護或者儲存.於是我們想用盡量小的數,假使有k個比較小的數,相互xor同樣能求出值域y.而這些k個數,我們就稱之為線性基.

又有xor是在(0,1)為基底的空間裡的運算.所以我們要把n多個數,解成二進位制.舉個栗子:

我們有集合=他們相互異或可以得到值域.但是這4個數,太大了誇張一下.我們就要想辦法縮小x得到集合.

於是,我們把這四個數寫成矩陣,就成了矩陣a.

.我們考慮把這個變成上三角形,那麼可以r3-r2+r4,然後r3和r4互換.

就可以得到乙個行階梯型的矩陣.

於是集合->=.嗯,沒錯,就是我們要求得的線性基.當然,我們也可以處理掉10,保留9

如果計算一下的話,會發現,得到的值域是相同的.於是,我們就可以稱為線性基.

由圖3,很明顯我們知道了乙個求線性基的方法,是高斯消元.但是太麻煩,繁瑣,耗時.常用的是另一種.

一句話介紹就是:

將x轉換為二進位制,從高位向低位掃,如果第乙個1是第p位,如果k_p=0,就令k_p=x;如果k_p!=0,就令xxork_p後,重複上述階段.

for

(int i = bit ; i >=

0; i--

)//bit是二進位制的位數,常見題目大多為62.if(

1<< i & num )if(

!base[i]

)else num ^

= base[i]

;

貪心,從高位向低位貪心,可知,從高到底,後面的無法改變高位,只要高位變為最大的即可

for

(int i =

62; i >=

0; i--

) ans =

max(ans, ans^p[i]

);

貪心,從高位向低位貪心,可知,從高到底,後面的無法改變高位,只要高位變為最小的即可

for

(int i =

62; i >=

0; i--

) ans =

min(ans, ans^p[i]

);

這是一道模板題。

題目描述

給定n個整數(數字可能重複),求在這些數中選取任意個,使得他們的異或和最大。

輸入輸出格式

輸入格式:

第一行乙個數n,表示元素個數

接下來一行n個數

輸出格式:

僅一行,表示答案。

輸入輸出樣例

**輸入樣例#1: **

21 1

**輸出樣例#1: **1說明

1≤n≤50,0≤si≤250 解析

模板題目

#include

#include

#include

#include

#include

#include

#include

#include

#ifndef null

#define null 0

#endif

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e5+10;

ll a[maxn]

, p[maxn]

, dp[maxn]

;int

main()

else

a[i]

^= p[j]

;for

(int i =

62; i >=

0; i--

) ans =

max(ans, ans^p[i]);

cout << ans << endl;

return0;

}

題目描述

輸入描述:

第一行乙個整數n,表示星球數

接下來一行有n個整數,第i個整數表示pi

輸出描述:

乙個整數表示到達n號星球時最大的耐久度

若不能到達n號星球或到達時的最大耐久度為0則輸出−1

示例輸入

3457 456 23

輸出

478說明

小a有兩種方法到達3號星球

第一種:1→2→3,最終耐久度為457⊕456⊕23=22

第二種:1→3,最終耐久度為457⊕23=478

輸入

42 4 4 2

輸出

-1輸入

5234 233 123 2333 23

輸出

253備註:1⩽n,∀pi⩽3000解析

求從p1到pn的異或和最大值,套板子…然後注意的是pi到pj的話需要pi>pj.所以不符合的數直接扔掉就可以了.

最後再判斷一下p1和pn之間的大小關係就好了.

#include

#include

#include

#include

#include

#include

#include

#include

#ifndef null

#define null 0

#endif

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e5+10;

int a[maxn]

, p[maxn]

;int

main()

else

p[i]

^= a[j]

;int ans = p[0]

^ p[n -1]

;for

(int i =

12; i >=

0; i--

) ans =

max(ans, ans^a[i]);

cout <<

(p[0

]>p[n-1]

?ans:-1

)<< endl;

return0;

}

蒟蒻的學習記錄第三週

c語言檔案操作 內容多參考自c語言詳解 file檔案操作 文字檔案是以字元編碼的方式進行儲存的。二進位制檔案將記憶體中資料原封不至檔案中,適用於非字元為主的資料。如果以記事本開啟,只會看到一堆亂碼。其實,除了文字檔案外,所有的資料都可以算是二進位制檔案。二進位制檔案的優點在於訪問速度快,占用空間小,...

演算法與資料結構(三)線性表的查詢演算法

查詢表 由同一類資料元素構成的集合。線性表 數表 雜湊表 關鍵字 是資料元素中某個資料項的值,用它可以表示乙個資料元素。主關鍵字 唯一地標識 次關鍵字 不唯一地標識 查詢 根據制定的某個值,在查詢表中確定乙個其關鍵字等於給定的這個值的資料元素 動態 靜態查詢 查表的同時改表成為動態查詢,反之為靜態查...

機器學習基礎演算法三 線性回歸演算法實驗(梯度下降法)

import numpy as np import pandas as pd from sklearn.datasets import load boston 增加 的列數行數和每行的寬度以此讓資料集完整表示 pd.set option display.max rows 1000 pd.set op...