日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ 2054]疯狂的馒头

發布時間:2024/4/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ 2054]疯狂的馒头 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

這題一看是區間染色,直接上線段樹。數據范圍N<= 106,M <= 107,如果跑線段樹復雜度為O(MlogN),但是時間限制10s,所以復雜度能過。

具體操作就是倒著算區間,因為每個饅頭最后的顏色是最后一次染上的顏色,如果我們倒著染色,那么被染色過的點就是最后的顏色,之后再染這個點就沒用了。所以直接上代碼:

#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define N 1000100 #define ls (x << 1) #define rs (x << 1 | 1) #define mid ((l + r) >> 1) using namespace std; int tree[4 * N]; void push_up(int x) {tree[x] = tree[ls] && tree[rs];//除了葉子節點之外的點只需要保存是否染過色就行return; } void modify(int x,int nl,int nr,int l,int r,int k) {if(tree[x]) return;if(l == r) {tree[x] = k;//葉子節點直接保存顏色return;}if(nl <= mid) modify(ls,nl,nr,l,mid,k);if(nr > mid) modify(rs,nl,nr,mid + 1,r,k);push_up(x);return; } void print(int x,int l,int r) {if(l == r) {printf("%d\n",tree[x]);//輸出葉子節點return;}print(ls,l,mid);print(rs,mid + 1,r); } int p,q,n,m; int main() {scanf("%d %d %d %d",&n,&m,&p,&q);for(int i = m;i >= 1;i--){int l = (int)((long long)(i * p + q) % n + 1ll);//這里強制類型轉換防止在做乘法的時候爆intint r = (int)((long long)(i * q + p) % n + 1ll);if(l > r) swap(l,r);modify(1,l,r,1,n,i);}print(1,1,n); }

?

轉載于:https://www.cnblogs.com/lijilai-oi/p/10945070.html

總結

以上是生活随笔為你收集整理的[BZOJ 2054]疯狂的馒头的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。