Luogu4230 連體病原體

2022-04-29 01:21:07 字數 1171 閱讀 2684

題面戳我

很好想+很好寫的一道題,然而比賽中我還是沒有切掉qaq。

lct列舉左端點\(i\),向右移動右端點指標\(j\)找到第乙個成環的位置。此時\([i,j],[i,j+1]...[i,m]\)都是合法答案。可見就是在區間\([i,j]\)上區間加\(m-j+1\),再在\([j+1,m]\)上加上乙個等差數列\(m-j,m-j-1...1\)

等差數列直接二階差分最後做兩次字首和即可。

以下內容摘自出題人題解

時間複雜度o(nlogn) ,期望得分100分,實際得分75~100分

faq:為什麼我寫了lct卻只得了75分/90分

a:因為findroot後要splay才能保證複雜度,不splay的都被我卡到o(n^2)啦!

發現自己以前寫的lct從來沒有在findroot後splay。細思極恐。

#include#includeusing namespace std;

const int n = 1000005;

int gi()

int m,u[n],v[n],o[n<<1],fa[n],ch[2][n],rev[n],stack[n],top,t1[n],t2[n];

bool son(int x)

bool isroot(int x)

void reverse(int x)

void pushdown(int x)

void rotate(int x)

void splay(int x)

void access(int x)

void makeroot(int x)

int findroot(int x)

void split(int x,int y)

void link(int x,int y)

void cut(int x,int y)

int main()

for (int i=1;i<=m;++i) t2[i]+=t2[i-1];

for (int i=1;i<=m;++i) t1[i]+=t1[i-1],t2[i]+=t2[i-1];

for (int i=1;i<=m;++i) printf("%d ",t1[i]+t2[i]);

return 0;

}

Luogu 選擇客棧

思路就是,從1到n列舉,輸入color和price的值,我們需要記錄乙個距離第二個客棧最近的咖啡廳價錢合理的客棧位置,用乙個now變數記錄。開三個輔助陣列,last i 表示最後乙個以i為顏色的客棧的位置,cnt i 表示以i為顏色的客棧總數,sum i 可以看作是乙個臨時陣列,用來儲存當前的方案數...

Luogu 運輸計畫

inline 神奇的東西 最好戒掉吧 read 除外 這道題將求解性問題轉化為判定性問題,當然就是二分答案了 二分刪掉邊後最短路徑的最大值 mid 將所有的比mid大的詢問求交集 樹上差分,cnt s cnt t cnt lca s,t 2 最後統計每個節點以及該節點的子樹的cnt的和,若 和 比m...

luogu 花生採摘

魯賓遜先生和多多都很開心,因為花生正是他們的最愛。在告示牌背後,路邊真的有一塊花生田,花生植株整齊地排列成矩形網格 如圖1 有經驗的多多一眼就能看出,每棵花生植株下的花生有多少。為了訓練多多的算術,魯賓遜先生說 你先找出花生最多的植株,去採摘它的花生 然後再找出剩下的植株裡花生最多的,去採摘它的花生...