題意是給你兩個字串 進行兩種操作 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,由...