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("");
     
         
        
}
posted @ 2021-01-21 19:48  iwwi  阅读(61)  评论(0)    收藏  举报