這題感覺有點坑,陣列越界了,看來以後陣列要盡可能的開大一些了。
#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 關鍵點是...