洛谷 P2391 白雪皚皚 線段樹 優化

2022-03-30 20:43:03 字數 1404 閱讀 7695

現在有 \(n\) 片雪花排成一列。 pty 要對雪花進行$ m $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%n+1\) 片雪花和第\((i*q+p)%n+1\)片雪花之間的雪花(包括端點)染成顏色 \(i\)。其中 \(p\),\(q\) 是給定的兩個正整數。他想知道最後 \(n\) 片雪花被染成了什麼顏色。

輸入格式

包含 4 行:

\(n m p q\) 意義如題中所述。

輸出格式

包含 \(n\) 行:

第 \(i\) 行表示第 \(i\) 片雪花被染成的顏色 c

100%的資料滿足:1<=n<=1000000,1<=m<=10000000

保證 \(1<=m*p+q\),\(m*q+p<=2*10^9\)

第一眼看到這道題,這不就是線段樹裸題嗎?

再看一眼資料範圍,發現過不去,我們可以看到所給的修改區間是特殊的

,然後就開始快樂的打表找規律,經過打表,我們發現,針對區間的修改

是多個最大長度為\(n\)的迴圈節,(我也不會證)然後區間修改就從1e7降

為了1e6,剩下的就是線段樹模板了。

看了一下題解,大部分都是鍊錶,並查集(可我沒想出來)

就用線段樹水了一發

本題的資料還是很水的(之前錯誤的暴力都能過,現在過不了了)

注意餘數處理喲!

#include#include#include#includeusing namespace std;

const int maxn=1e6+100;

inline int read()

while(ch<='9'&&ch>='0')

return ret*f;

}int n,m,p,q;

struct node

}tre[maxn*4];

void build(int rt,int l,int r)

int mid=(l+r)>>1;

build(rt*2,l,mid);

build(rt*2+1,mid+1,r);

}void pushdown(int rt)

return ;

}void update(int rt,int l,int r,int ql,int qr,int k)

if(ql<=l&&qr>=r)

int mid=(l+r)>>1;

pushdown(rt);

if(ql<=mid)

if(qr>mid)

return ;

}void out(int rt,int l,int r)

int main()

for(int i=lr;i<=m;i++)

out(1,1,n);

return 0;

}

完結撒花!!

P2391 白雪皚皚

miku 顯然思路是倒著掃,倒著染。然而這樣有乙個問題,這樣做,那麼對於已經染色的區間是不需要重新染色的,但是遍歷的時候可以找到已染色區間的乙個端點,另乙個在哪?用並查集解決 fa x 為x右邊第乙個沒染色的端點 然後就o n 解決了 fa n 1 0,那麼就可以愉快的爆棧 15分了 include...

洛谷P2391 白雪皚皚 並查集

柴門聞犬吠,風雪夜歸人 冬天,不期而至。千里冰封,萬里雪飄。空中颳起了鴨毛大雪。雪花紛紛,降落人間。美能量星球 pty 在 spore 上的乙個殖民地 上的人們被這美景所震撼。但是 pty 卻不高興,他不喜歡白色的世界,他覺得這樣太單調了。所以他想對雪花進行染色,讓世界變得多彩些。現在有 n 片雪花...

線段樹2 洛谷p3373 線段樹

題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...