牛客練習賽58

2021-10-03 08:21:35 字數 3412 閱讀 5629

a

給你兩個序列ai,

bia_i,b_i

ai​,bi

​,然後讓你兩兩配對相加,使得最大值最小。

貪心。乙個從大到小排,乙個從小到大排,直接相加。

b給你乙個01字串,然後讓你找到最多的組,滿足每一組都有0和1。

貪心。從前往後掃。遇到0和1是立馬累加,

思路:一開始想得是每次挑出行和列中的最大值,然後累加,沒有過,很納悶,然後想出了一組資料證明了直接挑選最大值不一定正確,因為可能有好幾個最大值。

2 2 2

2 1 3

1 1 1

做法:我們一共會選k

kk次,我們列舉會從行中選多少次,加入選i

ii次,那麼從從列中選k−i

k-ik−

i次。每次選的時候我們在行/列中都選和最大的那個累加,然後更新下。取最大值即可。

int n,m,k;

int w[20]

[20];

ll x_[20]

,y_[20]

;ll x[20]

,y[20];

intmain()

ll ans =0;

for(

int i =

0;i <= k;

++i)

rep(j,i+

1,k)

ans =

max(ans,m);}

cout << ans;

}

可以列舉在行中取的情況,二進位制列舉即可。不過要特判k

>=n

∣∣k>=m

k>=n||k>=m

k>=n

∣∣k>=m

這種情況。

思路:dp。

好題啊!!!

我當時思路只想到了bfs,而且並不好寫,估計寫出來也超時。

首先分析下,

右邊為0

00的話可以走過去;否則下邊為0的時候可以走過去;否則,左邊為0走過去,這個時候發現騰出的位置又為0了,下一次又走過去,走回來,這是沒有意義的,所以不往左走。然後分析往上走,這是說明不能往右走,說明他剛剛往右走到這裡的,或者往下到這裡的,因為往左走會造成反覆橫跳,往上走有走回去了,所以也不能往上走。

只有往右走和往下走是有意義的,經典棋盤型dp。

設d p[

i][j

]dp[i][j]

dp[i][

j]是到這裡所設障礙最小。

然後考慮dp[

思路:預處理這個n

nn個數,對於a

ia_i

ai​,進行分解因數,然後為每個因數開乙個vector,儲存下標i

ii,代表著這個因數是a[i

]a[i]

a[i]

的因子。

然後給定查詢l,r

,xl,r,x

l,r,

x我們列舉x

xx的因數,然後二分判斷是否在[l,

r][l,r]

[l,r

]這個區間內有它的倍數,每次取最大值。

vector<

int> q[n]

;int a[n]

;void

init

(int n,

int id)}}

intsolve

(int x,

int l,

int r)

intmain()

int l,r,x;

rep(i,

1,q)

}printf

("%d\n"

,ans);}

}

牛客練習賽58 F

求帶單點修改的樹上兩點間任意子路徑長異或和。路徑長等於路徑上所有異或和。簡單模擬一下,可以發現。奇數情況下,答案是偶數點異或和。偶數情況下,就是正常的異或和。偶數點異或和也很容易處理。分深度奇偶樹狀陣列即可。但是這是對於鏈的,不能直接dfs dfsdf s序,需要剖分一下。但是我不會,所以去學了一下...

牛客練習賽58 D 迷宮

乙個n m迷宮,迷宮中每個格仔用0或1表示,0表示該格仔可以通過,1表示該格仔是個障礙物,牛妹站在格仔 1,1 出口在格仔 n,m 牛妹想要走出迷宮,但牛妹只會按以下策略走 牛妹當前所在的格仔稱為當前格仔 如果當前格仔右邊沒有障礙物,牛妹就向右走,否則轉到2。如果當前格仔下方沒有障礙物,牛妹就向下走...

牛客練習賽58 D 迷宮

題目鏈結 有乙個n m迷宮,迷宮中每個格仔用0或1表示,0表示該格仔可以通過,1表示該格仔是個障礙物,牛妹站在格仔 1,1 出口在格仔 n,m 牛妹想要走出迷宮,但牛妹只會按以下策略走 牛妹當前所在的格仔稱為當前格仔 1.如果當前格仔右邊沒有障礙物,牛妹就向右走,否則轉到2。2.如果當前格仔下方沒有...