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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:
洛谷
BZOJ


分析:

好像沒有什么好說的就是一個平衡樹的板子……唯一要注意的就是這里要找的并不是嚴格的前驅和后繼,因為如果找到之前某一天的營業額和它相等那么差就是0,所以我們仍然在結構體中開一個域cnt來存儲同一個元素存儲了多少次,如果a[p].cnt>1說明這個元素已經出現了不止一次了,那么直接跳出循環,返回a[p].val即可。

這一段代碼貼在這里:

if(val==a[p].val){if(a[p].cnt>1){ans=p;break;}... }

然后說一下我的沙雕錯誤……建樹的時候手一抽在左子樹上壓了個INF,在右子樹上壓了個-INF,然后敲敲打打找了兩個小時的bug……
對于這件事我只想說:媽的智障!


全部代碼如下:

#include<bits/stdc++.h> #define maxn 40000 using namespace std; struct treap{int val;int l,r;int dat;int size;int cnt; }a[maxn]; int tot,root,n,inf=0x7fffffff,ans=0;inline int read(){int cn=0,f=1;char c;c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){cn=cn*10+c-'0';c=getchar();}return cn*f; }inline int New(int val){a[++tot].val=val;a[tot].dat=rand();a[tot].cnt=a[tot].size=1;return tot; }inline void update(int p){a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt; }inline void build_tree(){New(-inf),New(inf);root=1;a[1].r=2;update(root); }void zig(int &p){int q=a[p].l;a[p].l=a[q].r,a[q].r=p,p=q;update(a[p].r),update(p); }void zag(int &p){int q=a[p].r;a[p].r=a[q].l,a[q].l=p,p=q;update(a[p].l),update(p); }void insert(int &p,int val){if(p==0){p=New(val);return;}if(val==a[p].val){a[p].cnt++,update(p);return;}if(val<a[p].val){insert(a[p].l,val);if(a[p].dat<a[a[p].l].dat)zig(p);}else{insert(a[p].r,val);if(a[p].dat<a[a[p].r].dat)zag(p);}update(p); }int get_pre(int val){int ans=1;//a[1].val==-infint p=root;while(p){if(val==a[p].val){if(a[p].cnt>1){ans=p;break;}if(a[p].l>0){p=a[p].l;while(a[p].r>0)p=a[p].r;ans=p;}break;}if(a[p].val<val&&a[p].val>a[ans].val) ans=p;p=val<a[p].val?a[p].l:a[p].r;}return a[ans].val; }int get_next(int val){int ans=2;// a[2].val==infint p=root;while(p){if(val==a[p].val){if(a[p].cnt>1){ans=p;break;}if(a[p].r>0){p=a[p].r;while(a[p].l>0)p=a[p].l;ans=p;}break;}if(a[p].val>val&&a[p].val<a[ans].val) ans=p;p=val<a[p].val?a[p].l:a[p].r;}return a[ans].val; }int main(){ // freopen("turnover.in","r",stdin); // freopen("turnover.out","w",stdout);n=read();build_tree();srand(19260817);for(register int i=1;i<=n;i++){int x;x=read();insert(root,x);if(i==1)ans+=x;else{if(get_pre(x)==-inf){ans+=get_next(x)-x;continue;}if(get_next(x)==inf){ans+=x-get_pre(x);continue;}ans+=min(x-get_pre(x),get_next(x)-x);} // cout<<ans<<endl;}printf("%d",ans);return 0; }

轉載于:https://www.cnblogs.com/kma093/p/9744022.html

總結

以上是生活随笔為你收集整理的洛谷p2234/BZOJ1588 [HNOI2002]营业额统计的全部內容,希望文章能夠幫你解決所遇到的問題。

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