# B

# 题目大意

给定一个字符串 SStt 是其子串,如果 t0t_0tlastt_{last} 都是字符 t 的话,它就会有一个值,字符t的个数2字符串长度2\frac{字符t的个数 - 2}{字符串长度 - 2}
请你求出最大的这个值

# 题解

  • 1len1001 \le len \le 100

# 题解

其实题目很容易,但是为什么写在这呢?
是因为,在写这题的时候,用了 vectorvector,在其大小为 00 的时候,我访问了 idx.size() - 1
此时会有一个神奇的事情发生,这个的结果并不是 1-1,而是一个超级大的数,为什么呢?
这是由于 .size().size() 的类型是无符号整数,当 1-1 后,直接溢出了,进而会造成 TLETLE

# C

# 题目大意

你有 nn 个茶包,第 ii 个茶包里有 AiA_i 包茶,口味为 ii
现在你和庄家做一个游戏,游戏难度在 [1,i=1nAi][1, \sum\limits_{i=1}^{n} A_i],假设为 bb

  • 你申明一个整数 xxbxi=1nAib \le x \le \sum\limits_{i=1}^{n} A_i
  • 庄家从桌子上选 xx 包茶给你
  • 你从 xx 包茶中选择 bb
  • 如果这 bb 包都是一个口味,那么你赢了

你现在有 QQ 个问题,第 jj 个问题是

  • 一个难度为 BjB_j 的游戏,你能获胜的最小整数 xx 是多少(必须赢)

# 题解

我要从你给我的一堆茶中,选 bb 包同样口味的
站在庄家的角度
\to 如果一开始,某个茶包中的茶数量 <b< b,庄家可以把这个茶包里的茶全部给我;然后可以找到第一个 b\ge b 的茶包( idxidx ),1idx11 \to idx - 1 都可以给我 \to 二分找 bb前缀和计算前 idx1idx - 1
接下来,是不是有 nbn - b 个茶包里面的茶 b\ge b,如果给我 (nb)(b1)(n-b) * (b-1) 包,那我就赢不了
也就是说,再多给我一包,我就赢了
xx = pre[idx - 1] + (n - b) * (b - 1) + 1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void solve () {
cin >> n >> q, a = vector<int>(n + 1), pre = vector<int>(n + 1);
for (int i = 1, x; i <= n; i++)
cin >> a[i];

sort(a.begin() + 1, a.end());

for (int i = 1; i <= n; i++)
pre[i] = pre[i - 1] + a[i];

while (q--) {
int res = 0;

cin >> b;

if (b > a[n]) {
cout << -1 << '\n';
continue;
}

int idx = lower_bound(a.begin() + 1, a.begin() + n + 1, b) - a.begin();

res += pre[idx - 1] + (n - idx + 1) * (b - 1) + 1;

cout << res << '\n';
}
}

# D

# 题目大意

给你一个长度为 nn 的,只由 0/10/1 组成的字符串 ss,你可以执行任意次一下操作

  • 任选两个相邻的字符,两者相同则变为 11,否则变为 00

如果一个字符串能通过若干次这种操作,变为一个 11,则称这个字符串为好字符串
现在给你一个字符串,问其中,有多少个字串是好字符串

# 数据范围

  • 1n1051 \le n \le 10^5

# 题解

不难发现,只要字符串中,00 的个数是偶数个,那么这个字符串就是好字符串
利用 的思想,计算个数

C++
1
2
3
4
5
6
7
8
9
10
11
void solve () {
cin >> n, s = " " + s, t[0]++;

for (int i = 1; i <= n; i++) {
cnt += (s[i] == '0');

res += t[cnt % 2]++;
}

cout << res << '\n';
}

# E

# 题目大意

给定 nn 个点,每个点的坐标是 (xi,yi)(x_i,y_i),保证不存在三点共线,请问一共能确定多少个梯形

# 数据范围

  • 4N20004 \le N \le 2000
  • 0Xi,Yi1070 \le X_i, Y_i \le 10^7

# 题解

题目答案 == 一对边平行的数量 - 平行四边形的数量

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int n;
vector<PII> a;
map<PII, int> xl;
unordered_map<double, int> f;

void solve () {
cin >> n, a = vector<PII>(n);
int res = 0;

for (int i = 0; i < n; i++) {
cin >> a[i].first >> a[i].second;

for (int j = 0; j < i; j++) {
xl[{a[i].first + a[j].first, a[i].second + a[j].second}]++;
}
}

for (auto t : xl)
res -= t.second * (t.second - 1) / 2;

for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
double xx = a[i].first - a[j].first, yy = a[i].second - a[j].second;

if (xx == 0)
f[-1e8]++;
else
f[yy / xx]++;
}
}

for (auto t : f)
res += t.second * (t.second - 1) / 2;

cout << res << '\n';
}

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

duoxichangan 微信支付

微信支付

duoxichangan 支付宝

支付宝