HDU 6845 杭電多校7 B 線性基

2022-05-01 03:42:07 字數 950 閱讀 4872

這不是題解, 只是個人記錄乙個小知識點

起因是不知道題解裡那句 "對於 \(n\) 個人的每個字首,求出從後往前插入的線性基,並記錄每個基是哪個人提供的,這是乙個經典演算法" 所指的經典演算法是啥, 讀了**之後知道, 原來演算法流程是這樣的: 從前往後掃, 當前是第 \(i\) 個向量 \(x\) 時, 按正常插入線性基從高位往低位掃 x, 第 \(j\) 位遇到 \(1\) 時檢查 \(bas[j][0]\) 是否為 \(0\), 不為 \(0\) 時, \(bas[j][0] = x\), \(bas[j][1]=i\); 否則, 執行 \(if(ti>bas[j][1]) swap(bas[j][0],x),swap(bas[j][1],ti)\), \(ti\) 初值為 \(i\), 後面正常 x^=bas[j][0], 繼續掃.

意思就是說我新來乙個向量 \(a[i]=x\), 接管了前面的 \(a[k]=y\) 向量對位置 \(j\) 的最後控制權, 但是 a[k]=x^y 可以去接管剩餘的低位. 乍一看會覺得明明是 \(a[i]\) 提供了低位的數, 但"控制權"歸 \(a[k]\), 這是因為 \(a[k]\) 通過控制第 \(j\) 位來間接控制了 \(a[i]\). 好吧可能我這段話是在放屁, 但是, emm, 反正我信了.

下面的**是在標程基礎上刪了一些沒必要的部分.

#include using namespace std;

#define ll long long

const int maxn = 1e5 + 5;

int bas[maxn][30][2], p[maxn], n, m, x, y, q, opt, b[maxn], w, ti, t;

int main() else }}

}for (int i = 1; i <= q; i++)

printf("%d\n", w);}}

}}

2019 杭電多校 HDU 6623

minimal power of prime 題意 讓你把乙個數質因數分解,輸出所有質因數指數的最小值。這個題還是挺有意思的,解題思路也比較好玩。思路 先預處理出10000以內的素數預處理出來。對於每乙個 n 我們先處理它10000以內的質因數,那麼剩下的質因數的指數就不可能超過4,單獨判斷即可 為...

HDU6592 杭電多校第二場B

include include include includeusing namespace std const int maxn 3e5 4 int pos1 maxn pos2 maxn d maxn pos1 i 表示以i位置結尾的lis長度,d i 表示長度為i的lis結尾元素最小值 int...

2019杭電多校 HDU 6695 貪心

題解 分成兩組,其中一組最大的x 另一組最大的y 絕對值最小 題解 按照x從小到大排序,列舉最大x,比x大的都放到另一組,每處理完y記錄一下,然後從前面找到大於x和小於x的最符合的,判斷一下是否可取,然後就是很多x相等的,找乙個y最符合的 include using namespace std ty...