題意:就是給你兩個有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+
x21
dx=
2π,求1π∫
0∞1∏
i=1n
(ai2
+x2)
dx
\frac \int_^ \frac^(a_^ + x^)}dx
π1∫0∞
∏i=
1n(
ai2
+x2)
1dx
這道題強行喚醒我的數學…但最終以失敗告終…看了好幾個巨巨的部落格……這裡感謝這位大佬的部落格: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+
x21
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 * b
和y * 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可以無條件使用,那麼就可...