這個題要用到李超線段樹(orz李超)……大概這是李超那篇**出現後第二年的題?不管了直接介紹這一資料結構。李超線段樹的目的就是查詢出每個點被線段覆蓋的情況,操作無非就是插入線段和查詢兩件事。
查詢線段:不斷地遞迴查詢,從根節點整條數軸一直查詢到單點,期間找到最值就進行修改。
可以證明,單次修改時間複雜度$o(log^2n)$,單次查詢時間複雜度$o(logn)$,因此複雜度完全足夠。
1 #include2 #include3 #include4 #include5 #include6bzoj3165using
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()
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 由小寫...