線段樹專題 hdu4614

2021-07-03 00:09:03 字數 1278 閱讀 5331

這個題的話思路不複雜

對於每個1操作,利用兩次二分來查詢它的操作區間,然後把這個區間都賦值為1,

對於每個2操作,直接把區間賦值為零好了。。

線段樹維護乙個sum儲存當前區間為值0的點有多少個就好

#include#include#include#include#include#includeusing namespace std;

struct rectree[200100];

int n,m,tot,ans_r,ans_l;

void updata(int x)

if (tree[x].rch!=0)

tree[x].biao=0;

} if (tree[x].biao==2)

if (tree[x].rch!=0)

tree[x].biao=0; }}

void maketree(int l,int r)

int mid=(l+r)>>1;

tree[now].lch=tot+1;maketree(l,mid);

tree[now].rch=tot+1;maketree(mid+1,r);

tree[now].sum=tree[tree[now].lch].sum+tree[tree[now].rch].sum;

}void change(int x,int l,int r,int w)

int mid=(tree[x].l+tree[x].r)>>1;

if (l<=mid) change(tree[x].lch,l,r,w);

if (r>mid) change(tree[x].rch,l,r,w);

tree[x].sum=tree[tree[x].lch].sum+tree[tree[x].rch].sum;

}int getsum(int x,int l,int r)

int main()

tmp=min(tmp,c);

ll=b,rr=n;

while (ll!=rr)

ans_r=rr;ans_l=ll;ll=b;rr=rr;

while (ll!=rr)

printf("%d %d\n",ll-1,ans_r-1);

change(1,ll,ans_r,1);

}if (a==2)

}printf("\n");

} return 0;

}

剛會學校的時候寫這個東西還是有點費勁的,但是現在感覺已經是隨手寫了。果然是在進步嗎,真是太好了。

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