Luogu P7244 章節劃分

2022-02-01 02:27:34 字數 1438 閱讀 4177

這題從一月初看題解做到現在,必須寫個題解紀念下。

link

下文中 \(\sigma_k(x)\) 表示 \(x\) 所有因數的 \(k\) 次方和。根據定義,\(\sigma_0(x)\) 表示 \(x\) 所有因數的 \(0\) 次方和即 \(x\) 的因數數量。

由於答案一定是 \(\max\\) 的因數,所以 \(\mathcal o(\sigma_0(\max\))\) 列舉答案 \(x\),轉化為判定問題。定義乙個區間 \([l,r]\) 是合法的,當且僅當 \([l,r]\) 的最大值 \(y\) 滿足 \(y\mid x\)。注意到兩個合法的區間合併後仍然是合法的區間,所以可以設計乙個 dp:令 \(f(i)\) 表示 \(1\sim n\) 最多能分成多少個合法區間,那麼轉移方程為:

\[f(i)=\max\limits_^\left\^i\left\\bmod x=0]\right\}

\]上面這種轉移的時間複雜度為 \(\mathcal o(n^2\sigma_0(\max\))\) 的,考慮優化。令 \(a_0=0\),\(p\) 為滿足 \(a_p>a_i\;(0\le p的最大的 \(p\),那麼 \([1,p)\) 的所有轉移一定劣於 \([p,i-1]\) 的轉移,在 \([p,i-1]\) 再分一段是更優的,而這個區間的 \(\max\) 一定都是 \(a_i\),所以轉移時只考慮 \(f(p)\sim f(i-1)\) 即可,通過線段樹維護可以實現 \(\mathcal o(n\log n\sigma_0(\max\))\) 的時間複雜度。

#include#include#include#includeusing namespace std;

const int n=1e5;

int n,k,a[n+10];

void max(int &x,int y)

//segment tree

int m[n*4+10];

void modify(int p,int l,int r,int ml,int d)

int mid=(l+r)/2;

if(ml<=mid) modify(p*2,l,mid,ml,d);

else modify(p*2+1,mid+1,r,ml,d);

m[p]=max(m[p*2],m[p*2+1]);

}int query(int p,int l,int r,int ql,int qr)

// stack

int st[n+10],top=0,pre[n+10];

void getpre()

int main()

getpre();

// for(int i=1;i<=n;i++) printf("%d ",pre[i]);

// putchar('\n');

for(int i=mx;i;i--) }

return 0;

}

感謝:

構建之法 1 5章節

第一章 概論 這一章節裡面大多是理論知識的介紹吧,初步地了解到軟體和軟體工程是兩種不一樣的概念。軟體工程在軟體的發展中產生,他的特殊性 工程 的概念 還有軟體工程與電腦科學的關係,軟體工程的目標在1.2裡面有提及。這一張章節裡面主要接受他的概念,沒什麼其他疑問,可能是了解得不夠深刻,沒有被困擾。第二...

python 第6章節 字典

1.在pythonkhaki,字典是一系列鍵值對,每個分鍵都與乙個值相關聯,你可以使用鍵來訪問與之相關的值。與鍵相關聯的值可以是數字 字串或者字典。字典名 2.鍵和值之間用冒號分隔,而鍵和鍵之間用逗號分隔。3.訪問字典 字典名 鍵號 4.新增鍵值對 字典是一種動態結構,可隨時在其中新增鍵值對,要新增...

C primer 讀書筆記(2,4,5章節)

第二章1.關於什麼是物件?一般而言,物件就是記憶體中具有型別的區域,說的具體一點,就是計算左值表示式就會產生物件。2.關於初始化,分為直接初始化 direct initialization 和複製初始化 copy initialization 直接初始化是把初始化式放在括號裡,複製初始化語法用等號 ...