hdu 4614 線段樹 二分

2021-07-08 15:27:52 字數 1244 閱讀 5813

這題感覺有點坑,陣列越界了,看來以後陣列要盡可能的開大一些了。

#include #include #include #include #include using namespace std;

#define maxn 60005

struct ee

tree[maxn*4];

int n,m;

void build(int a,int l,int r)

void pushup(int a)

void pushdown(int a,int flag)

int query(int a,int l,int r)

if(l<=tree[a].l&&tree[a].r<=r)

return tree[a].length;

int mid=(tree[a].r+tree[a].l)/2;

if(l<=mid)

ans+=query(a*2,l,r);

if(mid+1<=r)

ans+=query(a*2+1,l,r);

return ans;

}int find(int a,int num)  //這點以後要注意了,根據空位來查詢,因為樹節點間接記錄了空位長度的資訊,如果根據點或者直接用query來查詢的話,時間複雜度多了lg(n),關鍵是不好找具體結尾的位置

if(tree[a].r==tree[a].l)

return tree[a].r;

if(tree[a*2].r+1-tree[a*2].l-tree[a*2].lengthelse

ans=find(a*2,num);

return ans;

}void change(int a,int l,int r,int flag)

if(tree[a].flag!=-1)

int mid=(tree[a].r+tree[a].l)/2;

if(l<=mid)

change(a*2,l,r,flag);

if(midchange(a*2+1,l,r,flag);

pushup(a);

}int main()

else

change(1,s,e,1);

printf("%d %d\n",s,e);}}

else

}printf("\n");

t--;

}return 0;

}

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...

hdu4614 二分 線段樹

題意 給你1 n的花瓶 剛開始全是空的,現在有兩種操作,1 從花瓶a開始插入b朵花 如果不能插進去 輸出字串 否則輸出最多插入的起點和終點 結構體陣列num i 表示節點i空瓶的數目 線段樹 開始deal函式對整個樹初始化,update 更新函式 find 查詢區間有多少個空瓶 對於操作1 關鍵點是...