2019牛客多校訓練營第三場補題

2022-06-03 18:42:14 字數 2185 閱讀 8358

b題:crazy binary string

把0看成-1,字首和,pos[ 0+n ] = 0

#include using

namespace

std;

const

int maxn = 1e5+3

;int

a[maxn];

int pos[maxn<<1

];string

s;int

main()

for(int i=0; i<=2*n; i++)

pos[

0+n ] = 0; //

注意這個不是簡單的0 而是 0+n

int ans=0

;

for(int i=0; i)

}cout

int zero=0

;

for(int i=0; i)

cout

<

}

view code

h題: magic line

排序 ,找 n/2點 和 n/2+1點

#include#include

#include

using

namespace

std;

const

int maxn=20000

;const

int m=900000009

;struct

pointpo[maxn];

bool

cmp(point a,point b)

intmain()

sort(po+1,po+1+n,cmp);

if(po[n/2].x!=po[n/2+1].x) printf("

%d %d %d %d\n

",po[n/2].x,m,po[n/2+1],-m);

else printf("

%d %d %d %d\n

",po[n/2].x-1,po[n/2+1].y+m,po[n/2].x+1,po[n/2].y-m);}}

view code

g題:removing stones

參考自啟發式分治,類似題:

題意:給定n,表示n堆石子,每堆石子數為a,問多少個區間,可以滿足「石子總和若為偶數,那麼可以兩兩取來自不同堆的石子,直到取完; 如果為奇數,那麼排除其中乙個,然後可以兩兩取來自不同堆的石子,直到取完」。

思路:結論是,如果乙個區間的區間和大於等於區間最大值的兩倍,則這個區間合法。 考慮分治,我們首先找到區間最大值(為了不重複統計,多個最大值時,統一取最左邊的,這個可以st表示實現),然後考慮跨越這個位置的合法區間個數。列舉一端,另外一段二分即可,選擇端時要用到啟發式,選擇更短的那一段,防止最差情況不斷發生。

由於分治的性質,我們每次的複雜度要傾向於小的那邊,即是乙個啟發式合併的逆過程,所以啟發式分治複雜度是o(nlogn)的,加上二分,這個做法的複雜度是o(nlog^2n)。

#include using

namespace

std;

const

int maxn = 3e5+3

;int

a[maxn];

int st[maxn][20

];int

lg[maxn];

intn;

long

long

suf[maxn],pre[maxn],ans;

void

init_log()

void init_st() //

關於最值的pos的st表 (多個最大值時,統一取最左邊的,這個可以st表示實現)

}}int rmq(int l,int r)

void solve(int l,int

r) }

else

}solve(l,mid-1

); solve(mid+1

,r);

}int

main()

for(int i=1; i<=n; i++)

init_st();

solve(

1,n);

printf(

"%lld\n

", ans);}}

view code

2019牛客暑期多校訓練營(第三場)

目錄 b crazy binary string 思維 d big integer 數論 f planting trees 思維 單調佇列 h magic line 計算幾何 j lru management 模擬 題意 計算最長的01子串和子串行,其中01數量相同。分析 對於子串那麼直接將0製成 ...

2019牛客暑期多校訓練營(第三場)F

這個學期終於結束了,暑假就要來了。然而,作為大學畢業要求的一部分,你必須在假期期間參加一些社會服務。最後,你決定加入乙個志願者團體,在山上植樹。為了簡化這個問題,讓我們用乙個n乘以n times n網格。讓我們給行編號1到n從上到下,給列編號1到n從左到右。用aij ij 表示第i行第j列的格仔的高...

2019牛客暑期多校訓練營(第三場) B題

題意 給你乙個長度為n的01字串,問該字串中01個數相等的最長子串和子串行分別是多少。分析 首先,大家要知道什麼是子串行,什麼是子串,子串行是不一定是連續的,它可以是原串中任意元素按照相對位置組成的序列,但是子串就不是了,子串一定是連續的,不可分割的按照絕對位置組成的序列。知道這個概念之後,大家可以...