SDOI2014 向量集(凸包 線段樹)

2021-09-10 18:11:19 字數 3427 閱讀 2139

題目鏈結

兩個操作:

1.在序列s中加入乙個向量;

2.求某個向量和s的區間[l,

r]

[l,r]

[l,r

]中向量的點積最大值。

n ,m

≤105

n,m\le 10^5

n,m≤10

5考慮兩個向量(a1

,b1)

,(a2

,b2)

(a_1,b_1),(a_2,b_2)

(a1​,b

1​),

(a2​

,b2​

),詢問向量為(x,

y)

(x,y)

(x,y

)。不妨令a1≤

a2

a_1\le a_2

a1​≤a2

​,如果1比2優,則有(a1

−a2)

x≥(b

2−b1

)y

(a_1-a_2)x\ge (b_2-b_1)y

(a1​−a

2​)x

≥(b2

​−b1

​)y。若y

>

0y>0

y>

0,則−x/

y≥(b

1−b2

)/(a

1−a2

)-x/y\ge (b_1-b_2)/(a_1-a_2)

−x/y≥(

b1​−

b2​)

/(a1

​−a2

​)。因此我們應該維護乙個斜率遞減的凸包(即上凸包)。

同理對於y

<

0y<0

y<

0的情況我們需要維護乙個下凸包,這個可以把所有座標取相反數維護乙個上凸包。

於是在往後加入點的過程中,如果線段樹某個節點滿了,就重建凸包,座標排序那部分可以直接歸併排序解決,複雜度就是o(n

logn

)o(nlogn)

o(nlog

n)的了。對於詢問,我們需要在每個節點上的凸包中二分斜率,因此這部分的複雜度為o(n

log2

n)

o(nlog^2n)

o(nlog

2n)。

#include

using

namespace std;

const

int maxr =

10000000

;char _read_[maxr]

, _print_[maxr]

;int _read_pos_, _print_pos_, _read_len_;

inline

char

readc()

template

<

typename t>

inline

void

read

(t &x)

template

<

typename t1,

typename..

.t2>

inline

void

read

(t1 &a, t2&..

. x)

inline

intreads

(char

*s)inline

void

ioflush()

inline

void

printc

(char c)

inline

void

prints

(char

*s)template

<

typename t>

inline

void

print

(t x,

char c =

'\n'

)else

printc

('0');

printc

(c);

}template

<

typename t1,

typename..

.t2>

inline

void

print

(t1 x, t2.

.. y)

typedef

long

long ll;

const

int maxt =

1<<20|

5, maxn =

400005

;struct vec ;}

inline vec operator-(

)const;}

inline ll det

(const vec &v)

const

inline ll dot

(const vec &v)

const

inline

bool

operator

<

(const vec &v)

const

} temp[maxn]

;struct hull

inline

const vec&

operator

(int x)

const

void

merge

(const hull &a,

const hull &b)

po =

new vec[n]

;for

(int i =

0; i < n; i++

) po[i]

= temp[i];}

ll query

(const vec &v)

return po[r]

.dot

(v);

}} tr[maxt][2

];int tot, n, tn;

void

push

(const vec &v)

; tr[k][1

].po =

new vec[1]

; tr[k][0

].n = tr[k][1

].n =1;

while

((k &1)

&& k >0)

}ll query

(int a,

int b,

const vec &v,

int l =1,

int r = tn,

int k =1)

char opt[5]

, tp[5]

;int

main()

));}

else);

}}ioflush()

;return0;

}

SDOI2014 數表 解題報告

這題並沒有做出來。設f i d i d 考慮按f i 排序,則對於詢問 n m n m f i 會貢獻 nd d 1 d n id mid 這樣我們按照id考慮即可。但是我做的時候錯誤地把它化成了這樣 nd d 1 d ni d m i d 這樣就很難考慮出來該怎麼做了。include includ...

SDOI 2014 重建 題解

題目傳送門 題目大意 給出一張圖,過後每條邊有乙個存在的概率,問 後圖變樹的概率。又長見識了 還有個變元矩陣樹定理。對於圖的一棵生成樹,它的出現概率為 存在的邊的 p i p i p i 之積乘不存在的邊的 1 p i 1 p i 1 p i 之積。設圖為 g gg,生成樹為 t tt,那麼用柿子表...

Sdoi2014 數數 數字dp AC自動機

time limit 10 sec memory limit 512 mb submit 834 solved 434 submit status discuss 我們稱乙個正整數n是幸運數,當且僅當它的十進位制表示中不包含數字串集合s中任意乙個元素作為其子串。例如當s 22,333,0233 時,...