hdu 4339 線段樹 二分

2021-06-28 08:09:42 字數 3349 閱讀 1751

題意是給你兩個字串    進行兩種操作   1: 修改其中乙個字串裡的某個字元2:   詢問從i起兩個字串最多由多少個是相同的;

先說一下做之前的想法   ,我是看別人介紹樹狀陣列是看到這道題的    本也想用樹狀陣列做  ,沒想上去    然後就改為線段樹了   ,有很明顯的點更新,區間查詢,所以選擇線段樹;

思路:  每個節點num【】 存3個值       p1  p2  flash   flash表示當前節點兩個字串是不是一樣的   若是則為1否則為0    p1 p2為當前兩個字串的字元(其實只有在最底端的節點  p1  p2才有意義)  題目給的是字元區間  而真正修改的是點    所以得先處理字串加到線段樹里也就是deal函式  (偷懶寫在乙個函式裡果斷超時了!!!)    然後對點來更新 

對於查詢 我是用的二分      開始j=最大長度     然後二分到底   雖然時間可能長點   但**比較簡單

#include#include#includeusing namespacestd;#define ll(x) (x<<1)

#define rr(x) ((x<<1)|1)

charstr1[1000010],str2[1000010];

structnodenum[4*1000000];

intmax(

inta,

intb)

intdeal(

intl,

intr,

intleft,

intright,

intmark,

intk,

charstr)

intmid=(l+r)/2;

if(right<=mid)

else if

(left>mid)

else

if(num[ll(mark)].flash==0||num[rr(mark)].flash==0)num[mark].flash=0;

elsenum[mark].flash=1;

return0;

}intupdate(

intl,

intr,

intdis,

intmark,

intk,

charp)

if(num[mark].flash==1)

intmid=(l+r)/2;

if(dis<=mid)

elseupdate(mid+1,r,dis,rr(mark),k,p);

if(num[ll(mark)].flash==0||num[rr(mark)].flash==0)

elsenum[mark].flash=1;

return0;

}intfind(

intl,

intr,

intleft,

intright,

intmark)

else if

(left>mid)

else

}int

main

()else

printf("%d\n",left-t-1);

}}

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

hdu6070 線段樹 二分

題意給你乙個區間,讓你找,區間種類數 區間長度最小是多少。思路先公式化簡 size r l 1 mid size l 1 mid r mid mid是二分的值 對於每乙個元素a i 他能影響的區間是,last a i 1 到i last表示這個這個元素上一次出現的位置 他能讓這個區間的種類數 1,由...