P8715 [蓝桥杯 2020 省 AB2] 子串分值
题目描述
对于一个字符串 S S S, 我们定义 S S S 的分值 f ( S ) f(S) f(S) 为 S S S 中恰好出现一次的字符个数。例如 f ( ′ ′ a b a ′ ′ ) = 1 f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)=1 f(′′aba′′)=1, f ( ′ ′ a b c ′ ′ ) = 3 f\left({ }^{\prime \prime} \mathrm{abc}{ }^{\prime \prime}\right)=3 f(′′abc′′)=3, f ( ′ ′ a a a a ′ ′ ) = 0 f\left({ }^{\prime \prime} \mathrm{aaa} \mathrm{a}^{\prime \prime}\right)=0 f(′′aaaa′′)=0 。
现在给定一个字符串
S
[
0..
n
−
1
]
S[0 . . n-1]
S[0..n−1](长度为
n
n
n),请你计算对于所有
S
S
S 的非空 子串
S
[
i
.
.
j
]
(
0
≤
i
≤
j
<
n
)
S[i . . j](0 \leq i \leq j<n)
S[i..j](0≤i≤j<n),
f
(
S
[
i
.
.
j
]
)
f(S[i . . j])
f(S[i..j]) 的和是多少。
题解

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int N = 2010;
int a[N] = {0};
int b[N] = {0};
int c[N] = {0};
int d[N] = {0};
int vis[N] = {0};
int g[N][N] = {0};
vector<int> mp[N];
void Solve()
{
int n, m, k, t;
cin >> n >> m >> k >> t;
queue<int> p;
// for(int i = 0; i <= n; ++i){
// for(int j = 0; j <= n; ++j){
// g[i][j] = 0;
// }
// }
for(int i = 1; i <= n; ++i){
cin >> a[i];
}
for(int i = 0; i <= n; ++i){
d[i] = 1e9;
}
for(int i = 1; i <= m; ++i){
int x;
cin >> x;
vis[x] = 1;
p.push(x);
d[x] = 0;
}
for(int i = 1; i <= k; ++i){
int aa, bb, cc;
cin >> aa >> bb >> cc;
mp[aa].push_back(bb);
mp[bb].push_back(aa);
g[aa][bb] = g[bb][aa] = cc;
}
while(!p.empty()){
int u = p.front();
p.pop();
vis[u] = 0;
for(auto i:mp[u]){
if(g[u][i]){
int v = g[u][i];
if(d[i] != 1e9){
d[v] = min(d[v], max(d[u], d[i]) + max(a[u], a[i]));
if(vis[v] == 0){
p.push(v);
vis[v] = 1;
}
}
}
}
}
cout << d[t] << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int __ = 1;
while(__--) Solve();
return 0;
}
P8733 [蓝桥杯 2020 国 C] 补给
题目描述
小蓝是一个直升飞机驾驶员,他负责给山区的 n n n 个村庄运送物资。
每个月,他都要到每个村庄至少一次,可以多于一次,将村庄需要的物资运送过去。
每个村庄都正好有一个直升机场,每两个村庄之间的路程都正好是村庄之间的直线距离。
由于直升机的油箱大小有限,小蓝单次飞行的距离不能超过 D D D。每个直升机场都有加油站,可以给直升机加满油。
每个月,小蓝都是从总部出发,给各个村庄运送完物资后回到总部。如果方便,小蓝中途也可以经过总部来加油。
总部位于编号为 1 1 1 的村庄。
请问,要完成一个月的任务,小蓝至少要飞行多长距离?
输入格式
输入的第一行包含两个整数 n n n, D D D,分别表示村庄的数量和单次飞行的距离。
接下来 n n n 行描述村庄的位置,其中第 i i i 行两个整数 x i x_i xi, y i y_i yi 分别表示编号为 i i i 的村庄的坐标。村庄 i i i 和村庄 j j j 之间的距离为 ( x i − x j ) 2 + ( y i − y j ) 2 \sqrt{(x_i-x_j)^2+(y_i-y_j)^2} (xi−xj)2+(yi−yj)2。
输出格式
输出一行,包含一个实数,四舍五入保留正好 2 2 2 位小数,表示答案。
2476

被折叠的 条评论
为什么被折叠?



