problem a
有兩條以(0,0)為端點,分別經過(a,b),(c,d)的射線,你要求出夾在兩條射線solution :中間,且距離(0,0)最近的點(x,y)
對於$100\%$的資料滿足$1 \leq t \leq 10^6 , 0 \leq a,b,c,d \leq 10^9$
每次刪除乙個下面那條線斜率下取整這塊三角形,然後將y座標下移,
每一次分治下去,最後一定會存在乙個時刻$(1,1)$合法,此時回溯回去即可。
由於分治前後,線段的相對位置不變,不會存在新的點更優,所以最後生成的答案一定是最優的。
每次查詢的複雜度大約是$o(n)$的。
具體可以看下面$a = 2,b = 7,c = 4,d = 10$的求值方法。
給出$n$個點$m$條邊的連通二分圖$g$ ,給出$q$組詢問,每次求出$u,v$路徑上(不一定是簡單路徑)的權值最大值。solution : 二分圖性質題。一條路徑的權值定義為,這條邊經過所有節點的異或和,同乙個點經過多次將會被計算多次。
對於$100\%$的資料滿足$1 \leq n,m,q\leq t\times 10^5$
對於乙個圖$g$是二分圖,滿足一定是兩個集合的點來考慮。
我們考慮$u - v$的一條路徑,如果走簡單路徑就是$u \ xor \ v$的權值,如果走乙個來回,那麼就是$0$的權值。
所以,對於任意兩點的任意一條路徑,我們都可以考慮兩個相鄰點權值是否被異或到路徑的答案中,可以同時取反。
對於詢問中處在相同集合的兩個點,路徑經過點的數目一定是奇數,選擇若干個點對翻轉一定會造成奇數個節點的權值被選擇(乙個極端的例子就是什麼節點都不翻轉狀態)
由於二分圖的連通性,問題就等價於求在所給點集裡找出奇數個點,使他們的異或和最大。
在詢問中處在相異集合裡的兩個點,路徑經過點的數目一定是偶數,選擇若干個點對翻轉一定會造成偶數個節點的權值被選擇(乙個極端的例子就是什麼節點都不翻轉狀態)
由於二分圖的連通性,問題就等價於求在所給點集裡找出偶數個點,使他們的異或和最大。
在所給點集裡找出偶數個點,使他們的異或和最大。這個問題可以將相鄰兩個點的點權插入到線性基裡面,然後求出線性基中的最大值即可。
在所給點集裡找出奇數個點,使他們的異或和最大。這個問題可以將相鄰兩個點的點權插入到線性基裡面,強制地任意的取乙個節點必須被異或,然後求出線性基中的最大值即可。
由於可以預處理這兩個答案,最後詢問的複雜度就是$o(1)$的,最終,本題的複雜度就是$o(n+q)$的。
# include usingb.cppnamespace
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;
}
problem c geo
平面直角座標系中有$n$個點$(x_i,y_i)$,求出有多少個二次函式$y = x^2 + bx +c$經過至少兩個點,並且任何點都不在這個函式的上方。solution :對於$100\%$的資料,滿足$n\leq 2\times 10^5$
對於點$(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 longc.cpp#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;
}
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...