Educational Codeforces Round 102
Educational Codeforces Round 102
A
判断最小的两个数加起来小于d或者最大的小于d
#include <bits/stdc++.h>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define dow(i,j,k) for (int i = j; i >= k; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef pair<int, int> pi;
typedef long long ll;
int n, d;
int a[10005];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--) {
cin >> n >> d;
rep(i,1,n) cin >> a[i];
sort(a + 1, a + n + 1);
if (a[n] <= d || n >= 2 && a[1] + a[2] <= d) cout << "YES\n";
else cout << "NO\n";
}
}
B
求一下lcm长度对应的A串,然后判断一下B串是不是符合。
#include <bits/stdc++.h>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define dow(i,j,k) for (int i = j; i >= k; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef pair<int, int> pi;
typedef long long ll;
int gcd(int x, int y) {
return y? gcd(y, x % y): x;
}
void solve() {
string s, t;
cin >> s >> t;
string lcm;
lcm.resize(s.size() * t.size() / gcd(s.size(), t.size()));
int n = s.size();
int m = t.size();
int g = lcm.size();
for (int i = 0; i < g; i++) {
lcm[i] = s[i%n];
if (lcm[i] != t[i%m]) {
cout << "-1\n";
return ;
}
}
cout << lcm << endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--) solve();
}
C
回文的部分要从大到小排,不回文的部分从小到大排。
#include <bits/stdc++.h>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define dow(i,j,k) for (int i = j; i >= k; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef pair<int, int> pi;
typedef long long ll;
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, k;
scanf("%d%d", &n, &k);
int sum = k - (n - k);
for (int i = 1; i < sum; i++) printf("%d ", i);
for (int i = k; i >= sum; i--) printf("%d ", i);
puts("");
}
}
D
找最大值和最小值,最大值显然是左一段前缀最大值,或者左一段的和加右一段的和减去后缀最小值。最小值同理
#include <bits/stdc++.h>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define dow(i,j,k) for (int i = j; i >= k; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef pair<int, int> pi;
typedef long long ll;
const int N = 2e5 + 100;
int n, m;
int mx1[N], mn1[N], sum1[N];
int mx2[N], mn2[N], sum2[N];;
char s[N];
void solve() {
scanf("%d%d", &n, &m);
scanf("%s", s+1);
memset(mx1, 0, sizeof(mx1));
memset(mn1, 0, sizeof(mn1));
memset(mx2, 0, sizeof(mx2));
memset(mn2, 0, sizeof(mn2));
memset(sum1, 0, sizeof(sum1));
memset(sum2, 0, sizeof(sum2));
for (int i = 1; i <= n; i++) {
if (s[i] == '+') sum1[i] = sum1[i-1] + 1;
else sum1[i] = sum1[i-1] - 1;
mx1[i] = max(mx1[i-1], sum1[i]);
mn1[i] = min(mn1[i-1], sum1[i]);
}
for (int i = n; i >= 1; i--) {
if (s[i] == '+') sum2[i] = sum2[i+1] + 1;
else sum2[i] = sum2[i+1] - 1;
mx2[i] = max(mx2[i+1], sum2[i]);
mn2[i] = min(mn2[i+1], sum2[i]);
}
for (int i = 1; i <= m; i++) {
int l, r;
scanf("%d%d", &l, &r);
l--, r++;
int mx = max(mx1[l], sum1[l] + sum2[r] - mn2[r]);
int mn = min(mn1[l], sum1[l] + sum2[r] - mx2[r]);
// cerr << mx1[l] << " " << mn1[l] << " " << mx2[r] << " " << mn2[r] << endl;
printf("%d\n", mx - mn + 1);
}
}
int main() {
int t;
scanf("%d", &t);
while (t--) solve();
}
E
考虑可以转化为一条边2, 一条边距离忽略的最短路。因为如果是最短路,一定是让最小边2,忽略最长一条边的距离。
加两维表示是否*2和是否忽略一条边即可。
#include <bits/stdc++.h>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define dow(i,j,k) for (int i = j; i >= k; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef pair<int, int> pi;
typedef long long ll;
const int N = 2e5 + 500;
vector<pi>G[N];
struct ele{
int to;
ll dis;
int x;
int y;
bool operator <(const ele &x) const {
return dis > x.dis;
}
};
ll dis[N][2][2];//x 是-最大边, y是2*最小边
bool vis[N][2][2];
int n, m;
int main() {
scanf("%d%d", &n, &m);
memset(dis, 0x3f, sizeof(dis));
rep(i,1,m) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
if (u > v) swap(u, v);
if (u == 1) dis[v][1][1] = w;
G[u].push_back({v, w});
G[v].push_back({u, w});
}
dis[1][0][0] = 0;
vis[1][0][0] = 1;
queue<ele>q;
q.push((ele){1,0,0,0});
while (!q.empty()) {
ele e = q.front(); q.pop();
int j = e.to, x = e.x, y = e.y;
ll d = dis[j][x][y];
vis[j][x][y] = 0;
// cout << j << " " << x << " " << y << " " << d << " " << endl;
for (auto i: G[j]) {
int v = i.first, w = i.second;
// cout << w << endl;
if (dis[v][x][y] > d + w) {
dis[v][x][y] = d + w;
if (!vis[v][x][y]) {
q.push((ele){v, d + w, x, y});
vis[v][x][y] = 1;
}
// cout << "-> " << v << " " << x << " " << y << " " << d + w << " " << dis[v][x][y] << endl;
}
if (x == 0) {
if (dis[v][1][y] > d) {
// cout << "-> " << v << " " << 1 << " " << y << endl;
dis[v][1][y] = d;
if (!vis[v][1][y]) {
q.push((ele){v, d, 1, y});
vis[v][1][y] = 1;
}
}
}
if (y == 0) {
if (dis[v][x][1] > d + w * 2) {
// cout << "-> " << v << " " << x << " " << 1 << endl;
dis[v][x][1] = d + w * 2;
if (!vis[v][x][1]) {
q.push((ele){v, dis[v][x][1], x, 1});
vis[v][x][1] = 1;
}
}
}
}
}
for (int i = 2; i <= n; i++) printf("%lld ", dis[i][1][1]);
puts("");
}

浙公网安备 33010602011771号