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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

發布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ.1558.[JSOI2009]等差数列(线段树 差分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BZOJ
洛谷

首先可以把原序列\(A_i\)轉化成差分序列\(B_i\)去做。
這樣對于區間加一個等差數列\((l,r,a_0,d)\),就可以轉化為\(B_{l-1}\)+=\(a_0\)\(B_r\)-=\((r-l)*d+a_0\)\(B_{l...r-1}\)+=\(d\)
對于查詢,似乎只需要求區間\(b_i\)的連續段個數?
并不是,比如:
\(A:\ 0\ 1\ 3\ 6\ 10\\B:\ \ \ 1\ 2\ 3\ 4\)
答案是\(3\)而不是\(4\),我們可以這樣劃分:\(\{0,1\},\{3,6\},\{10\}\),或是\(\{0,1\},\{3\},\{6,10\}\)等等,得到三個等差數列。
為什么會不是\(4\)呢,除了兩個數也是一個等差數列外,如果我們選擇了差分序列中的\(1,4\),也就是選\(\{0,1\},\{6,10\}\)劃分成兩個等差數列,那\(A_3=3\)是屬于\(B_2=2\)還是\(B_3=3\)呢?
問題其實在于,區間中間那個數只能屬于左右等差數列中的一個(或是相等的時候可以把兩個等差數列連起來)。

然而網上好多題解都沒有明說這件事啊?只看到兩三篇是這個意思的(這個和這個,yyb的其實也是吧),其它題解只是寫了下\(s\)的定義,一點關于"左右端點選不選"是什么的解釋都沒有(當然也許只是我不能理解)。
當然只是個人理解咯。(表示我一共想了三種理解哪種都能和代碼對應上,但前兩種并不能說過去)

然后,小區間內部的答案在合并成大區間時是不會變的,要考慮的只是端點屬于哪個區間的問題。
所以可以用線段樹維護,令\(L,R\)表示當前區間的\(B_l,B_r\)\(s_0,s_1,s_2,s_3\)分別表示,左右端點都不屬于這個區間(不與這個區間中的數構成等差數列)時的答案, 左端點屬于而右端點不屬于這個區間的答案,右端點屬于而左端點不屬于這個區間的答案,左右端點都屬于這個區間的答案。
有這些就可以合并區間了,這里就可以見代碼了。
詢問的答案,就是詢問區間合并后的\(s_3\)
因為是在差分后的序列上做,詢問\([l,r]\)是查詢\([l,r-1]\),還要注意邊界問題。
復雜度\(O(q\log n)\)

//12460kb   2476ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;int A[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Node
{int L,R,s0,s1,s2,s3;//s0:(l,r) 左右都不屬于 s1:[l,r) s2:(l,r] s3:[l,r] inline Node operator +(const Node &b){Node c;c.L=L, c.R=b.R; int v=R==b.L;c.s0=std::min(s2+b.s1-v, std::min(s0+b.s1, s2+b.s0));c.s1=std::min(s3+b.s1-v, std::min(s3+b.s0, s1+b.s1));c.s2=std::min(s2+b.s3-v, std::min(s0+b.s3, s2+b.s2));c.s3=std::min(s3+b.s3-v, std::min(s1+b.s3, s3+b.s2));return c;}
};
struct Segment_Tree
{#define ls rt<<1#define rs rt<<1|1#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define S N<<2int tag[S];Node t[S];#undef S#define Upd(x,v) t[x].L+=v, t[x].R+=v, tag[x]+=v#define Update(rt) t[rt]=t[ls]+t[rs]inline void PushDown(int rt){Upd(ls,tag[rt]), Upd(rs,tag[rt]), tag[rt]=0;}void Build(int l,int r,int rt){if(l==r){t[rt]=(Node){A[l],A[l],0,1,1,1};return;}int m=l+r>>1;Build(lson), Build(rson), Update(rt);}void Modify(int l,int r,int rt,int L,int R,int v){if(L<=l && r<=R) {Upd(rt,v); return;}if(tag[rt]) PushDown(rt);int m=l+r>>1;if(L<=m) Modify(lson,L,R,v);if(m<R) Modify(rson,L,R,v);Update(rt);}void ModifyP(int l,int r,int rt,int p,int v){if(l==r) {Upd(rt,v); return;}if(tag[rt]) PushDown(rt);int m=l+r>>1;p<=m ? ModifyP(lson,p,v) : ModifyP(rson,p,v);Update(rt);}Node Query(int l,int r,int rt,int L,int R){if(L<=l && r<=R) return t[rt];if(tag[rt]) PushDown(rt);int m=l+r>>1;if(L<=m)if(m<R) return Query(lson,L,R)+Query(rson,L,R);else return Query(lson,L,R);return Query(rson,L,R);}
}T;inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=='-'&&(f=-1),c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now*f;
}
inline char GetOpt()
{register char c=gc();while(c!='A'&&c!='B') c=gc();return c;
}int main()
{int n=read();for(int i=1; i<=n; ++i) A[i]=read();if(n==1){for(int Q=read(); Q--; )if(GetOpt()=='B') puts("1");return 0;}--n;for(int i=1; i<=n; ++i) A[i]=A[i+1]-A[i];T.Build(1,n,1);for(int Q=read(); Q--; )switch(GetOpt()){case 'A':{int l=read(),r=read(),a=read(),d=read();if(l<r) T.Modify(1,n,1,l,r-1,d);if(l>1) T.ModifyP(1,n,1,l-1,a);if(r<=n) T.ModifyP(1,n,1,r,(l-r)*d-a);//r!=n!break;}case 'B':{int l=read(),r=read();if(l!=r) printf("%d\n",T.Query(1,n,1,l,r-1).s3);else puts("1");break;}}return 0;
}

轉載于:https://www.cnblogs.com/SovietPower/p/10271976.html

總結

以上是生活随笔為你收集整理的BZOJ.1558.[JSOI2009]等差数列(线段树 差分)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产一区日韩一区 | 超碰97在线免费观看 | 精品人妻一区二区三区四区 | 日本欧美国产一区二区三区 | 国产福利在线视频观看 | 婷婷麻豆 | 19韩国主播青草vip | 五月婷婷综合久久 | 日本一区二区不卡在线 | 青青草国产 | 超碰在线公开免费 | 波多野结衣一区二区三区中文字幕 | 人妻少妇偷人精品无码 | 特黄aaaaaaaaa真人毛片 | 狠狠干2018| 五月天激情国产综合婷婷婷 | www.99视频 | 亚洲码无人客一区二区三区 | aa黄色片| 91网页入口| 免费一级淫片aaa片毛片a级 | 日韩经典第一页 | 爽爽影院免费观看 | 日av在线播放 | 美女被到爽高潮视频 | 日韩一级欧美一级 | 午夜激情在线播放 | 开心激情深爱 | 9999视频| 99色婷婷 | 爱情岛论坛亚洲品质自拍视频 | 免费国产黄色 | 五月激情在线观看 | 日韩欧美视频网站 | 五月婷婷六月综合 | 国产精品日韩一区 | 国产xxxx视频 | 汗汗视频| 极品蜜桃臀肥臀-x88av | 日韩成人午夜影院 | 国产后入又长又硬 | 福利在线影院 | 91精品日韩 | 男人猛进女人爽的大叫 | 黄色片视频免费看 | 精品美女久久久 | 成人亚洲一区 | 狠狠躁日日躁夜夜躁av | 国产网站黄色 | 土耳其xxxx性hd极品 | 色老头一区 | 欧美极品第一页 | 欧美熟妇精品黑人巨大一二三区 | 一级片黑人 | 日本猛少妇色xxxxx猛叫 | 依依激情网| 国产精品久久久久久久久久久久久久久久久 | 狠狠地日 | 午夜天堂在线观看 | 影音先锋男人站 | 熟妇人妻无乱码中文字幕真矢织江 | 天天干 夜夜操 | 天降女子在线 | 欧美网站在线观看 | 日本在线视频观看 | 国产高清中文字幕 | 日本熟妇人妻xxxxx | 黄色av电影网址 | 欧美精品手机在线 | 午夜免费体验区 | av在线男人天堂 | 亚洲色图3p | 2022av视频 | 无码人妻精品一区二区三区在线 | 人人妻人人澡人人爽人人精品 | 污网站免费看 | 日韩在线播放一区二区 | 99re5| 人人综合| 中文字幕av播放 | 国产亚洲欧美日韩精品 | 国产av电影一区 | 日韩av不卡在线播放 | 99热播精品 | 动漫裸体无遮挡 | 妺妺窝人体色www聚色窝仙踪 | 人妻夜夜爽天天爽三区麻豆av网站 | www.日| 免费观看视频在线观看 | 69精品国产| 日本妈妈9 | 色导航 | 在线视频你懂得 | 自拍一级片 | 色91在线 | 日韩久久电影 | 国产日韩精品一区二区三区 | 久久久精品视频在线观看 | 国产av电影一区二区三区 |