這個題的話思路不複雜
對於每個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...