題意:給你1-n的花瓶 ,剛開始全是空的,現在有兩種操作,
1:從花瓶a開始插入b朵花 如果不能插進去 輸出字串 否則輸出最多插入的起點和終點;
結構體陣列num【i】表示節點i空瓶的數目
線段樹 開始deal函式對整個樹初始化,update()更新函式 find()查詢區間有多少個空瓶; 對於操作1 關鍵點是找到起點和終點 這裡用二分 在【a,n】進行二分,
先二分起點 注意左右區間的變換(wa了好多次==) 然後在起點和n之間二分終點 最後更新 輸出 對於操作2 直接查詢即可;
#include#include#includeusing namespacestd;#define ll(x) (x<<1)#define rr(x) ((x<<1)|1)
structnodenum[50000*4];
intdeal(
intl,
intr,
intpoint)
intupdate(
intl,
intr,
intleft,
intright,
intpoint,
intk)
intmid=(l+r)/2;
if(num[point].cont==r-l+1)
if(num[point].cont==0)
if(right<=mid)
else if
(left>mid)
else
num[point].cont=num[ll(point)].cont+num[rr(point)].cont;
return0;
}intfind(
intl,
intr,
intleft,
intright,
intpoint)
returnsum;
}int
main
()elseleft=mid+1;
}if(cont<=b)
elseright=mid-1;
}//end=right;
}
else
elseleft=mid+1;
}//end=left;
}printf("%d %d\n",star-1,end-1);update(1,n,star,end,1,-1);}}
else
}printf("\n");
}return0;
}
hdu 4614 線段樹 二分
這題感覺有點坑,陣列越界了,看來以後陣列要盡可能的開大一些了。include include include include include using namespace std define maxn 60005 struct ee tree maxn 4 int n,m void build ...
hdu 4614 線段樹 二分
題意 n個花瓶,m個操作,花瓶裡面有的有花,有的是空的。1操作是從a開始往右放b朵花,花瓶有了的不放,跳過,直到a右邊都放滿了花,多餘的扔了。輸出本次放花的起始位置 求和操作可以用線段樹解決,操作1的放置的起始位置,通過二分求就可以 include include include include i...
HDU 4614(線段樹 二分)
題目 click 題意 操作是1,則從a開始插花f個,多了丟棄,沒有瓶子可放則輸出。2的話,區間內的所有花丟出。用二分去確定操作1中的起始位置以及終止位置,其他的線段樹維護。include include include include include include include include...