# A

水题,输出字符串中的大写字符

C++
1
2
3
4
5
6
void solve () {
char c;
while (cin >> c)
if (isupper(c))
cout << c;
}

# B

考队列的题目

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void solve () {
int t; cin >> t;
queue<int> q;

while (t--) {
int op;
cin >> op;

if (op == 1) {
int x;
cin >> x;
q.push(x);
}
else {
cout << q.front() << endl;
q.pop();
}
}
}

# C

# 题目大意

现在有编号从 11nnnn 种配料,餐厅提供 mm 道菜,每道菜使用了 KiK_i 种配料
初始时,你不喜欢所有的 nn 种配料,你不能吃任意一种有你不喜欢的配料的菜
再接下来的 nn 天中,每天你都会克服一种你不喜欢的配料,求在第 ii 天克服之后,你能吃到多少道菜

# 数据范围

  • 1N,M3×1051 \le N,M \le 3 \times 10^5

# 题解

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
void solve () {
cin >> n >> m;
vector<vector<int>> a(m + 1);
for (int i = 1, k; i <= m; i++) {
cin >> k;
for (int j = 1, b; j <= k; j++) {
cin >> b;
a[i].push_back(b);
}
}

map<int, int> mp;
for (int i = 1, t; i <= n; i++) {
cin >> t;
mp[t] = i;
}

vector<int> cnt(n + 1), cf(n + 1);

for (int i = 1; i <= m; i++) {
int res = 0;
for (int t : a[i])
res = max(res, mp[t]);
cf[res]++;
}

for (int i = 1; i <= n; i++) {
cf[i] += cf[i - 1];
cout << cf[i] << endl;
}
}

# D

# 题目大意

一个圆上顺时针标明了等距离nn 个点,现在有 mm 条不同的线,第 ii 条线经过了 aia_iaja_j 点,问,有多少条相交的线

# 数据范围

  • 2N1062 \le N \le 10^6
  • 1M3×1051 \le M \le 3 \times 10^5

# 题解


观察有,对于两条平行的线,其 (a + b) % n 是相同的,利用 map 记录
那么就可以遍历所有线,对于第 ii 条线,前面有 i1i - 1 条线,而 t = mp[(a + b) % n] 条线是和当前线平行的
故,会有 i - 1 - t 条线与当前这条新的线相交

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void solve () {
int res = 0;
map<int, int> mp;

cin >> n >> m;
for (int i = 1, a, b; i <= m; i++) {
cin >> a >> b;

int t = mp[(a + b) % n];

res += (i - 1 - t);

mp[(a + b) % n]++;
}

cout << res << endl;
}

# E

# 题目大意

现在有 nn 个题目,对于第 ii 个题目,提交一次需要花费 CiC_i 元,第 ii 个题目的分数是 SiS_i,你解开第 ii 个题目的概率是 Pi%P_i \%
你现在有 xx 元,请你计算你得分的期望的最大值是多少

# 数据范围

  • 1N81 \le N \le 8
  • 1Si27181 \le S_i \le 2718
  • 1Cix50001 \le C_i \le x \le 5000
  • 1Pi1001 \le P_i \le 100

# 题解

更新于 阅读次数

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

duoxichangan 微信支付

微信支付

duoxichangan 支付宝

支付宝