現在有 \(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才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...