[CODEVS3032]擺放球 解題報告,codevs3032解題

來源:互聯網
上載者:User

[CODEVS3032]擺放球 解題報告,codevs3032解題

這個題本來我是想練堆用的,結果堆沒練出來,倒是練了練線段樹。

此題屬於那種看起來特別簡單,一做起來做出翔的那種;交了六遍,對拍了N年才A。

主要需要注意的是這麼幾點:

1、節點儲存什麼資訊?

題目中讓求的是距離最大,但這玩意兒線上段樹中不太好辦;

我一開始想當然地寫成了r-l式的距離,結果合并資訊的時候呵呵了。

更好的做法是儲存區間中連續一段空櫥子的個數:①設定變數意義時一定要從易於理解和調試的角度出發。

顯然,最長連續區間的左右端點也是需要儲存的,因為我們需要用它來求出球該放在什麼地方。但是!若一個區間的長度為0,它的左右端點應該是哪裡?

2、②若[l,r]的長度為0,則令l=r+1,r=l-1.

為什嗎?看看在合并的時候我們做了什嗎?

設struct TS{int lmax,lR,rmax,rL,max,L,R}

if(tree[node<<1].lR=((l+r)>>1)+1){

tree[node].lmax+=tree[node<<1|1].lmax;

tree[node].lR=tree[node<<1|1].lR;

}

這時,若tree[node<<1|1].lmax=0會發生什麼呢?

若設此時tree[node<<1|1].lR=(l+r)>>1的話,則

tree[node<<1].lR=(l+r)>>1.

是正確的。

所以。。就這樣吧。

3、③三個變數中選擇最大的哪個該怎麼做?

很容易混亂。。

條理清晰?

把條件都完整的列出來!

if(a>=b&&a>=c){}

if(b>=a&&b>=c){}

if(c>=a&&c>=b){}

4、球該放在哪?

顯然球應該放在最長的連續無球櫥子區間中,但是。。具體在哪裡呢?

設區間[L,R]為一個最長連續無球櫥子區間,且L>1,R<N.

則顯然④球應該放在L-1與R+1的中位元的位置,才能使球與L-1和R+1的距離的最小值最大。

即x=(L-1+R+1)>>1=(L+R)>>1.

5、⑤特殊區間

從1往右延伸的區間與從N往左延伸的區間,球在這裡的距離長度就是區間長度!

6、記錄的max?

這時我們發現一個很大很大的問題!就是節點中記錄max,它不是那個最短距離,最短距離應該是max+1>>1!

也就是說,若果我們按max的大小比較,永遠在max最大的前提下選擇左邊的那個,很可能會導致只比當前選出的max小1而其+1>>1與當前選出的max相同且在其右邊的max被漏掉導致全盤皆輸!

但是,如果我們不按max來選,是否可能導致當前選出的max比較小,使得之後合成的max比實際選出的max要小呢?也就是說一個max差了1不算,但兩個差了2就不一樣了啊!

但是我們突然發現了一個問題!max不會被合成,唯一與max有關的運算只是Cmp;合成是交給lmax和rmax的,而lmax和rmax又不需要Cmp!

於是。。在無數遍的WA與摸爬滾打之中,我們終於找到了正解的道路。。

#include<iostream>using namespace std;#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>struct TS{int lmax,rmax,max,L,R,lR,rL;}tree[800000];int point[1000001];#define root 1,1,N#define lson node<<1,l,(l+r)>>1#define rson node<<1|1,((l+r)>>1)+1,rinline void update(int node,int l,int r,int x,int A){if(l==r)if(A)tree[node]=(TS){1,1,1,x-1,x+1,x+1,x-1};else tree[node]=(TS){0,0,0,r,l,l,r};else{int m=(l+r)>>1;if(x>m)update(rson,x,A);else update(lson,x,A);tree[node].lmax=tree[node<<1].lmax;if(tree[node<<1].lR==m+1){tree[node].lmax+=tree[node<<1|1].lmax;tree[node].lR=tree[node<<1|1].lR;}else tree[node].lR=tree[node<<1].lR;tree[node].rmax=tree[node<<1|1].rmax;if(tree[node<<1|1].rL==m){tree[node].rmax+=tree[node<<1].rmax;tree[node].rL=tree[node<<1].rL;}else tree[node].rL=tree[node<<1|1].rL;int tmp=tree[node<<1].rmax+tree[node<<1|1].lmax;if(tree[node<<1].max+1>>1>=tree[node<<1|1].max+1>>1&&tree[node<<1].max+1>>1>=tmp+1>>1){tree[node].max=tree[node<<1].max;tree[node].L=tree[node<<1].L;tree[node].R=tree[node<<1].R;}elseif(tmp+1>>1>=tree[node<<1].max+1>>1&&tmp+1>>1>=tree[node<<1|1].max+1>>1){tree[node].max=tmp;tree[node].L=tree[node<<1].rL;tree[node].R=tree[node<<1|1].lR;}else{tree[node].max=tree[node<<1|1].max;tree[node].L=tree[node<<1|1].L;tree[node].R=tree[node<<1|1].R;}}//cout<<l<<","<<r<<":"<<tree[node].max<<"("<<tree[node].L<<"->"<<tree[node].R<<")"<<" "<<tree[node].lmax<<"("<<l<<"->"<<tree[node].lR<<")"<<" "<<tree[node].rmax<<"("<<tree[node].rL<<"<-"<<r<<")\n";}inline void build(int node,int l,int r){tree[node]=(TS){r-l+1,r-l+1,r-l+1,l-1,r+1,r+1,l-1};if(l!=r)build(lson),build(rson);}inline void out(int node,int l,int r){if(l!=r)out(lson),out(rson);else cout<<!tree[node].max;}int main(){freopen("CODEVS3032.in","r",stdin);//freopen("CODEVS3032.out","w",stdout);memset(tree,0,sizeof(tree));int N,M,flag,A,x,tot=0,l,m,r;scanf("%d%d",&N,&M);build(root);while(M--){scanf("%d%d",&flag,&A);if(flag-1)update(root,point[A],1);else{//cout<<tree[1].lmax<<" "<<(tree[1].max+1>>1)<<" "<<tree[1].rmax<<endl;if(tree[1].lmax>=tree[1].rmax&&tree[1].lmax>=tree[1].max+1>>1)x=1;elseif(tree[1].max+1>>1>=tree[1].rmax&&tree[1].max+1>>1>=tree[1].lmax)x=(tree[1].L+tree[1].R)>>1;else x=N;printf("%d\n",x);update(root,x,0);point[A]=x;}/*cout<<flag<<" "<<A<<":";out(root);cout<<endl;*/}}

⑦重要總結:不論是多麼簡單的題,一定要寫對拍!這個題中一半的問題全是拍出來的!有很多題都是看似簡單實則不易。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.