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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

超神线段树 山海经

發布時間:2025/5/22 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 超神线段树 山海经 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??

問題 K: 山海經

時間限制:?1 Sec??內存限制:?128 MB

題目描述

“南山之首日鵲山。其首日招搖之山,臨于西海之上,多桂,多金玉。有草焉,其狀如韭而青華,其名日祝余,食之不饑……又東三百里,日堂庭之山,多棪木,多白猿,多水玉,多黃金。

又東三百八十里,日猨翼之山,其中多怪獸,水多怪魚,多白玉,多蝮蟲,多怪蛇,名怪木,不可以上。……”

《山海經》是以山為綱,以海為線記載古代的河流、植物、動物及礦產等情況,而且每一條記錄路線都不會有重復的山出現。某天,你的地理老師想重游《山海經》中的路線,為了簡化問題,老師已經把每座山用一個整數表示他對該山的喜惡程度,他想知道第a座山到第b座山的中間某段路(i,j)。能使他感到最滿意,即(i,j)這條路上所有山的喜惡度之和是(c,d)(a≤c≤d≤b)最大值。于是老師便向你請教,你能幫助他嗎?值得注意的是,在《山海經》中,第i座山只能到達第i+1座山。

輸入

輸入第1行是兩個數,n,m,2≤n≤100000,1≤m≤100000,n表示一共有n座山,m表示老師想查詢的數目。

第2行是n個整數,代表n座山的喜惡度,絕對值均小于10000。

以下m行每行有a,b兩個數,1≤a≤j≤b≤m,表示第a座山到第b座山。

輸出

一共有m行,每行有3個數i,j,s,表示從第i座山到第j座山總的喜惡度為s。顯然,對于每個查詢,有a≤i≤j≤b,如果有多組解,則輸出i最小的,如果i也相等,則輸出j最小的解。

樣例輸入

5 3 5 -6 3 -1 4 1 3 1 5 5 5

樣例輸出

1 1 5 3 5 6 5 5 4 超級麻煩QAQ。。調了一個晚上 區間連續和的最大,那么有三種可能,前綴最大,中間一段最大,后綴最大 又因為要輸出區間坐標,還要維護前綴坐標。。。。(前綴不需要左端點,后綴。。廢話)以及節點總和。? 那么pushup還有查詢該怎么轉移呢? x.l_max=max(lc.l_max,lc.sum+rc.l_max); x.mid_max=max(lc.mid_max,lc.r_max+rc.l_max,rc.mid_max); x.r_max=max(rc.r_max,rc.sum+lc.r_max); 注意值相同按左右端點。? 寫進一個函數求一下就行了~~ #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<iostream> #define ll long long #define N 100000 #define hmid a.hr+b.hl using namespace std; int n,m,a[N+5]; struct tree {int l,r,hl,hm,hr,h,r1,l2,r2,l3; } t[N*4+5]; ll read() {ll sum=0,f=1;char x=getchar();while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}while(x>='0'&&x<='9'){sum=sum*10+x-'0';x=getchar();}return sum*f; } tree pushup(tree a,tree b) {tree ans;ans.l=a.l;ans.r=b.r;ans.h=a.h+b.h;if(a.hl>=a.h+b.hl)ans.hl=a.hl,ans.r1=a.r1;elseans.hl=a.h+b.hl,ans.r1=b.r1;if(a.hr+b.h<b.hr)ans.hr=b.hr,ans.l3=b.l3;elseans.hr=a.hr+b.h,ans.l3=a.l3;if(b.hm>hmid&&b.hm>a.hm)ans.hm=b.hm,ans.l2=b.l2,ans.r2=b.r2;else{if(hmid>a.hm)ans.hm=hmid,ans.l2=a.l3,ans.r2=b.r1;else{if(a.hm>hmid)ans.hm=a.hm,ans.r2=a.r2,ans.l2=a.l2;else{if(a.l2<=a.l3)ans.hm=a.hm,ans.l2=a.l2,ans.r2=a.r2;elseans.hm=hmid,ans.l2=a.l3,ans.r2=b.r1;}}}return ans; } void build(int l,int r,int x) {t[x].l=l;t[x].r=r;if(l==r){t[x].h=t[x].hl=t[x].hm=t[x].hr=a[l];t[x].l2=t[x].l3=l;t[x].r1=t[x].r2=r;return;}int mid=(l+r)/2;build(l,mid,x*2);build(mid+1,r,x*2+1);t[x]=pushup(t[x*2],t[x*2+1]); } tree Q(int l,int r,int x) {if(t[x].l>=l&&t[x].r<=r){return t[x];}int mid=(t[x].l+t[x].r)/2;if(r<=mid)return Q(l,r,x*2);else{if(l>mid)return Q(l,r,x*2+1);elsereturn pushup(Q(l,r,x*2),Q(l,r,x*2+1));} } int yjn() { // freopen("hill.in","r",stdin);// freopen("hill.out","w",stdout);n=read();m=read();for(int i=1;i<=n;i++)a[i]=read();build(1,n,1);int x,y;while(m--){scanf("%d%d",&x,&y);tree ans=Q(x,y,1);if(ans.hr>ans.hl&&ans.hr>ans.hm)printf("%d %d %d\n",ans.l3,ans.r,ans.hr);elseif(ans.hl>ans.hm)printf("%d %d %d\n",ans.l,ans.r1,ans.hl);elseprintf("%d %d %d\n",ans.l2,ans.r2,ans.hm);} } int qty=yjn(); int main(){;}

轉載于:https://www.cnblogs.com/QTY2001/p/7632738.html

總結

以上是生活随笔為你收集整理的超神线段树 山海经的全部內容,希望文章能夠幫你解決所遇到的問題。

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