bzoj3165 segment 超哥線段樹

2022-03-27 02:06:04 字數 1559 閱讀 2532

這個題要用到李超線段樹(orz李超)……大概這是李超那篇**出現後第二年的題?不管了直接介紹這一資料結構。李超線段樹的目的就是查詢出每個點被線段覆蓋的情況,操作無非就是插入線段和查詢兩件事。

查詢線段:不斷地遞迴查詢,從根節點整條數軸一直查詢到單點,期間找到最值就進行修改。

可以證明,單次修改時間複雜度$o(log^2n)$,單次查詢時間複雜度$o(logn)$,因此複雜度完全足夠。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=100005,maxp=40005;const

double eps=1e-9;8

struct

node

9s[maxn<<2

];12

int dcmp(double

x)13

16#define mid ((l+r)>>1)

17#define lc root<<1

18#define rc root<<1|1

19#define lson lc,l,mid

20#define rson rc,mid+1,r

21 inline void solve(int root,int l,int r,int idx,double k,double

b)22

28double y0=s[root].k*l+s[root].b,y1=k*l+b,y2=s[root].k*r+s[root].b,y3=k*r+b;

29if(dcmp(y1-y0)>0&&dcmp(y3-y2)>0)30

35if(dcmp(y1-y0)<=0&&dcmp(y3-y2)<=0)return;36

solve(lson,idx,k,b);solve(rson,idx,k,b);37}

38 inline void insert(int root,int l,int r,int l,int r,int idx,double k,double

b)39

41if(l<=mid)insert(lson,l,r,idx,k,b);if(r>mid)insert(rson,l,r,idx,k,b);42}

43 inline void insert(int x0,int x1,int y0,int y1,int

num)

4447

double ans;int

ans_id;

48 inline void query(int root,int l,int r,int

pos)

4955

inta[maxn],id[maxn];

56int

haha()

5770

else

7179

else

insert(x0,x1,y0,y1,num);80}

81}82}

83int sb=haha();

84int main()

bzoj3165

316 去除重複字母

給定乙個僅包含小寫字母的字串,去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 bcabc 輸出 abc 示例 2 輸入 cbacdcbc 輸出 acdb 我的 超時 class solution string removedu...

316 去除重複字母

給定乙個僅包含小寫字母的字串,去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 bcabc 輸出 abc 示例 2 輸入 cbacdcbc 輸出 acdb 分析 這道題就是,第一去重複,第二就是選擇最小的字串。去重複倒是不難,主...

316 去除重複字母

給你乙個字串 s 請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小 要求不能打亂其他字元的相對位置 注意 該題與 1081 相同 示例 1 輸入 s bcabc 輸出 abc 示例 2 輸入 s cbacdcbc 輸出 acdb 1 s.length 104 s 由小寫...