2023年牛客多校第1場 賽後總結

2021-09-25 10:13:05 字數 4134 閱讀 7266

題意:就是給你兩個有n個不同數的串,然後保證1-p區間內任選乙個區間,使得區間中最小值的下標相同,找到最大的p值

思路:我的思路是設定兩個單調棧,然後每次的第i個數判斷大小,放到棧頂(比它大的數彈出棧),當兩個棧容量不同時,即不成立。

**如下:

#include

using namespace std;

typedef

long

long ll;

const

int maxn =

5e5+5;

int a[maxn]

, b[maxn]

;stack<

int>s1, s2;

intmain

(void

) cout << ans << endl;

}return0;

}

題意:已知∫0∞

11+x

2dx=

π2

\int_^ \frac} dx = \frac

∫0∞​1+

x2​1

​dx=

2π​,求1π∫

0∞1∏

i=1n

(ai2

+x2)

dx

\frac \int_^ \frac^(a_^ + x^)}dx

π1​∫0∞

​∏i=

1n​(

ai2​

+x2)

1​dx

這道題強行喚醒我的數學…但最終以失敗告終…看了好幾個巨巨的部落格……這裡感謝這位大佬的部落格:2019牛客網暑期多校第一場b題

$ \frac(a_ + x)},=,\frac} + x},+,\frac} + x},+…+\frac} + x^} \ , \

\qquad\quad\quad;;, = \frac\cdot \prod_(a_^ + x^) + …+c_\cdot \prod_(a_^ + x^) + … + +c_\cdot \prod_(a_^ + x)}(a_^ + x^)}$

我們可以得到: ∑i=

1nci

⋅∏j≠

i(ai

2+x2

)=

1\sum_^c_\cdot \prod_(a_^ + x^)\,=\,1

∑i=1n​

ci​⋅

∏j​

=i​(

ai2​

+x2)

=1由數學歸納法,可得:ci=

1∏j≠

i(aj

2−ai

2)

c_\,=\,\frac(a_^-a_^)}

ci​=∏j

​=i

​(aj

2​−a

i2​)

1​又因為∫0∞

11+x

2dx=

π2

\int_^ \frac} dx = \frac

∫0∞​1+

x2​1

​dx=

2π​$\frac \int_^ \frac(a_ + x^)}dx,=,\frac\sum_\int_\frac}+x} dx

\,\ \qquad\qquad\qquad\qquad;=,\frac\sum_c_\int_\frac+x} dx

\,\ \qquad\qquad\qquad\qquad;=,\frac\sum_^\frac}}\cdot \frac

\,\ \qquad\qquad\qquad\qquad;=,\sum_^\frac}}

\,\ \qquad\qquad\qquad\qquad;=,\frac\sum_^\frac}\cdot \prod_(a_-a_)} $

然後進行逆元,費馬小定理

#include

using namespace std;

typedef

long

long ll;

const

int mod =

1e9+7;

const

int maxn =

1e3+10;

ll a[maxn]

;ll qpow

(ll a, ll b)

return res;

}int

main

(void

) ans +

=qpow(2

* a[i]

% mod * res % mod, mod -2)

;}ans =

(ans % mod + mod)

% mod;

cout << ans << endl;

}}

題意:有n個"ab",m個"ba",問能結合成多少個序列.這個要求是ab和ba的順序不變,即a和b的相對位置不變,ba中可以穿插ab,反之亦然

那麼我們採用dp,dp[i][j]表示放置i個a和j個b方案數

也就是說我們當前串也就是後面新增a還是新增b的情況

dp[i]

[j]+

= dp[i -1]

[j];

dp[i]

[j]+

= dp[i]

[j -1]

;

當i ≤ n時,a可以隨便放;

當j ≤ m時,b可以隨便放;

當i > n,如果放a,ab的數量要小於等於n,i - j是至少有多少個ab, i - j ≤ n;

當j > m,如果放b,ba的數量要小於等於m,j - i是至少有多少個ba, j - i ≤ m;

if

(i - j <= n) d[i]

[j]+

= d[i -1]

[j];

if(j - i <= m) d[i]

[j]+

= d[i]

[j -1]

];

最終**如下(ps: 用於資料組過多,memset會卡t,跟緩衝區有關)

#include

using namespace std;

const

int mod =

1e9+7;

const

int maxn =

2e3+10;

int dp[maxn]

[maxn]

;int

main

(void)}

printf

("%d\n"

, dp[n + m]

[n + m]);

}return0;

}

題意:求三角形內部乙個點連三個頂點形成的最大三角形面積的期望,再乘乙個36

答案是 11/2 倍三角形 abc 的面積

#include

using namespace std;

struct pointa, b, c;

point ab, bc;

intmain

(void

)return0;

}

題意:判斷x/a和y/b的大小,其中1 ≤ x, y ≤ 1018, 1 ≤ a, b ≤ 109

簽到題,這道題我們直接用的大整數寫的,判斷x * by * a,沒什麼好說的

其實出題人是想考察數學方面知識的,官方題解是這樣的:

先把 x

a\frac

ax​ 寫成 [xa

]+xm

odaa

[\frac] + \frac

[ax​]+

axmo

da​先比整數部分,分數部分分子分母都在 109 範圍內,交叉相乘比較

#include

static std:

:pair

fcompare

(uint64_t x, uint32_t a, uint64_t y, uint32_t b);}

x %= a;

y %= b;

return;}

intmain

(void

)return0;

}

2019牛客多校第九場

由題意可設x y kp bx y kp b x y kp b代入第二個式子中可以得到kpx bx x2 c mod kpx bx x 2 equiv c mod kpx bx x2 c modp p p 第一項是p的倍數可以約掉,所以有x2 bx c 0 m od x 2 bx c equiv 0 ...

牛客多校第3場 C Shuffle Cards

之所以補這題,是因為第一次使用rope,這是乙個可持久化平衡樹。不過本題沒有用到可持久化就是了,平衡樹的split和merge。include using namespace gnu cxx 下標從0開始,不可以cin,可以cout 由於rope的底層實現,insert,erase,get都是log...

牛客多校第5場D Drop Voicing

有乙個1 n的排列,有以下兩種操作 drop 2 將倒數第二個數放到開頭,前面的數向後平移 invert 將倒數第二個數放到開頭,前面的數向後平移 若干連續的drop 2稱為multi drop。計算要使該排列排成1 n所需的最少的multi drop的數量。首先invert可以無條件使用,那麼就可...