HGOI 20190816 省常中互測8

2022-05-30 17:24:10 字數 3325 閱讀 1093

problem a

有兩條以(0,0)為端點,分別經過(a,b),(c,d)的射線,你要求出夾在兩條射線

中間,且距離(0,0)最近的點(x,y)

對於$100\%$的資料滿足$1 \leq t \leq 10^6 , 0 \leq a,b,c,d \leq 10^9$

solution : 

每次刪除乙個下面那條線斜率下取整這塊三角形,然後將y座標下移,

每一次分治下去,最後一定會存在乙個時刻$(1,1)$合法,此時回溯回去即可。

由於分治前後,線段的相對位置不變,不會存在新的點更優,所以最後生成的答案一定是最優的。

每次查詢的複雜度大約是$o(n)$的。

具體可以看下面$a = 2,b = 7,c = 4,d = 10$的求值方法。

給出$n$個點$m$條邊的連通二分圖$g$ ,給出$q$組詢問,每次求出$u,v$路徑上(不一定是簡單路徑)的權值最大值。

一條路徑的權值定義為,這條邊經過所有節點的異或和,同乙個點經過多次將會被計算多次。

對於$100\%$的資料滿足$1 \leq n,m,q\leq t\times 10^5$

solution : 二分圖性質題。

對於乙個圖$g$是二分圖,滿足一定是兩個集合的點來考慮。

我們考慮$u - v$的一條路徑,如果走簡單路徑就是$u \ xor \ v$的權值,如果走乙個來回,那麼就是$0$的權值。

所以,對於任意兩點的任意一條路徑,我們都可以考慮兩個相鄰點權值是否被異或到路徑的答案中,可以同時取反。

對於詢問中處在相同集合的兩個點,路徑經過點的數目一定是奇數,選擇若干個點對翻轉一定會造成奇數個節點的權值被選擇(乙個極端的例子就是什麼節點都不翻轉狀態)

由於二分圖的連通性,問題就等價於求在所給點集裡找出奇數個點,使他們的異或和最大。

在詢問中處在相異集合裡的兩個點,路徑經過點的數目一定是偶數,選擇若干個點對翻轉一定會造成偶數個節點的權值被選擇(乙個極端的例子就是什麼節點都不翻轉狀態)

由於二分圖的連通性,問題就等價於求在所給點集裡找出偶數個點,使他們的異或和最大。

在所給點集裡找出偶數個點,使他們的異或和最大。這個問題可以將相鄰兩個點的點權插入到線性基裡面,然後求出線性基中的最大值即可。

在所給點集裡找出奇數個點,使他們的異或和最大。這個問題可以將相鄰兩個點的點權插入到線性基裡面,強制地任意的取乙個節點必須被異或,然後求出線性基中的最大值即可。

由於可以預處理這兩個答案,最後詢問的複雜度就是$o(1)$的,最終,本題的複雜度就是$o(n+q)$的。

# include using

namespace

std;

const

int n=5e5+10

;struct

reca[n

<<1

];int

head[n],n,m,q,val[n],tot,col[n];

void adde(int u,int

v)struct

linear_basis

void insert(int

x)

else x^=d[i];}}

int query(int

ret)

}b;void dfs(int u,intc)}

intmain()

dfs(

1,1);

for (int i=1;i1

]);

int same = b.query(val[1

]);

int diff = b.query(0

);

while (q--)

return0;

}

b.cpp

problem c geo

平面直角座標系中有$n$個點$(x_i,y_i)$,求出有多少個二次函式$y = x^2 + bx +c$經過至少兩個點,並且任何點都不在這個函式的上方。

對於$100\%$的資料,滿足$n\leq 2\times 10^5$

solution :

對於點$(x,y)$在$y = x^2 + bx + c$下方的條件是$x^2 + bx + c \geq y$

化簡後就是$bx + c\geq y - x^2 $

對於所有的點$(x,y)$都是一定的,如果我們把每個點的座標轉化為$(x,y-x^2)$,

問題就轉化為求乙個一次函式$y = bx + c$使得這個一次函式至少經過兩個點並且在所有點上方。

問題就等價於求出乙個點集凸包的上部的邊的條數。

即所有在左極點和右極點連線嚴格上方的點數+1。

複雜度就是$o(n)$的。

#include#define ll long long

#define inf (1e18)

using

namespace

std;

struct pa[200010],s[200010

],l,r;

ll n,k=1,top=1

,ans;

double cross(p a,p b,p c)

double dis(p a,p b)

bool

cmp(p x,p y)

intmain()

l=,r=;

for(ll i=1;i<=top;i++)

for(ll i=1;i<=top;i++)if(cross(l,r,s[i])>0)ans++;

printf(

"%lld\n

",ans+1

);

return0;

}

c.cpp

HGOI 物品選取

小x確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小x需要挑選一些在路上使用的物品,但他只有乙個能裝體積為 m 的揹包。顯然,揹包問題對小x來說過於簡單了,所以他希望你來幫他解決這個問題。小x可以選擇的物品有 n 樣,一共分為甲乙丙三類 1甲類物品的價值隨著你分...

HGOI20181031 模擬題解

sol 第一題就dp?然後寫了o n 2 dp再 考慮優化!盡量部分分帶上!我寫了正確的dp然後優化錯了,具體的dp方法是考慮到對於右側到左側他是沒有後效性的 所以定義f i 為i及以後最大的代價和,對於合法的j,轉移f i max,j需要滿足a i x i i 由於給出的a i 遞增然後我只要往i...

HGOI7 7集訓題解

今天這把題有點簡單,除了第二題數學方法沒想到之外,剩下的250草草收場。題目描述 include include include include include include include using namespace std void fff const int maxn 55 int be...