2019 Multi-University Training Contest 10

Valentine's Day

#include <bits/stdc++.h>
 
using namespace std;
const int maxn=10100;
double p[maxn];
int n;
bool cmp(double x, double y){
    return x>y;
}
int main() {
    int _;
    scanf("%d",&_);
    while (_--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%lf", &p[i]);
        }
        sort(p + 1, p + n + 1, cmp);
        double ans = p[1], tmp = (1 - p[1]);
        for (int i = 2; i <= n; i++) {
            double now = tmp * p[i] + ans * (1 - p[i]);
            if (now >= ans) {
                ans = now;
                tmp *= (1 - p[i]);
            }
        }
        printf("%.11lf\n", ans);
    }
    return 0;
}

Welcome Party

#include <bits/stdc++.h>
 
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3f;
set<ll>s;
set<ll>::iterator it;
int n;
ll suf[maxn];
struct node {
    ll x, y;
 
    bool operator<(const node &b) const {
        return x < b.x;
    }
}a[maxn];
 
int main() {
    int _;
    scanf("%d", &_);
    while (_--) {
        s.clear();
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%lld%lld", &a[i].x, &a[i].y);
        }
        sort(a + 1, a + n + 1);
        suf[n] = a[n].y;
        for (int i = n - 1; i >= 1; i--) {
            suf[i] = max(suf[i + 1], a[i].y);
        }
        ll ans = inf;
        for (int i = 1; i <= n; i++) {
            ll cur = inf, r=0;
            if (i < n) {
                r = suf[i + 1];
                cur = min(cur, abs(a[i].x - r));
            }
            it = s.lower_bound(a[i].x);
            if (it != s.end()) {
                cur = min(cur, abs(max(r, (*it)) - a[i].x));
            }
            if (it != s.begin()) it--;
            cur = min(cur, abs(max(r, (*it)) - a[i].x));
            s.insert(a[i].y);
            ans = min(ans, cur);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

Make Rounddog Happy

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int lg[maxn],n,st[maxn][21],k,a[maxn],vis[maxn],A[maxn],B[maxn];
ll ans;
int get(int l,int r){
    int k=lg[r-l+1];
    return a[st[l][k]]>=a[st[r-(1<<k)+1][k]]?st[l][k]:st[r-(1<<k)+1][k];
}
void solve(int l,int r) {
    if (l > r) return;
    int pos = get(l, r);
    if (pos - l < r - pos) {
        for (int i = l; i <= pos; i++) {
            int t = a[pos] - k, lr = i + t - 1;
            int kk = min(r, B[i]);
            lr = max(lr, pos);
            if (lr > kk) continue;
            ans += kk - lr + 1;
        }
    } else {
        for (int i = pos; i <= r; i++) {
            int t = a[pos] - k, rl = i - t + 1;
            int kk = max(l, A[i]);
            rl = min(rl, pos);
            if (rl < kk) continue;
            ans += rl - kk + 1;
        }
    }
    solve(l, pos - 1);
    solve(pos + 1, r);
}

int main() {
    int _;
    lg[0] = -1;
    for (int i = 1; i < maxn; i++) lg[i] = lg[i >> 1] + 1;
    scanf("%d", &_);
    while (_--) {
        scanf("%d%d", &n, &k);
        ans = 0;
        for (int i = 1; i <= n; i++) {
            st[i][0] = i;
            scanf("%d", &a[i]);
        }
        for (int i = 1; i <= 20; i++) {
            for (int j = 1; j <= n + 1 - (1 << i); j++) {
                st[j][i] =
                        a[st[j][i - 1]] > a[st[j + (1 << (i - 1))][i - 1]] ? st[j][i - 1] : st[j + (1 << (i - 1))][i - 1];
            }
        }
        for (int i = 1; i <= n; i++)
            vis[i] = 0;
        A[1] = 1;
        vis[a[1]] = 1;
        for (int i = 2; i <= n; i++) {
            if (vis[a[i]]) A[i] = max(A[i - 1], vis[a[i]] + 1);
            else A[i] = A[i - 1];
            vis[a[i]] = i;
        }
        for (int i = 1; i <= n; i++)
            vis[i] = 0;
        B[n] = n;
        vis[a[n]] = n;
        for (int i = n - 1; i >= 1; i--) {
            if (vis[a[i]]) B[i] = min(B[i + 1], vis[a[i]] - 1);
            else B[i] = B[i + 1];
            vis[a[i]] = i;
        }
        solve(1, n);
        printf("%lld\n", ans);
    }
    return 0;
}

Block Breaker

#include <bits/stdc++.h>
using namespace std;
const int maxn=2010;
int a[maxn][maxn],n,m,q;
bool check(int x,int y) {
    int cnt1 = 0, cnt2 = 0;
    if (a[x + 1][y] == 0 || a[x - 1][y] == 0) cnt1 = 1;
    if (a[x][y + 1] == 0 || a[x][y - 1] == 0) cnt2 = 1;
    if (cnt1 && cnt2)
        return 1;
    return 0;
}
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int ans=0;
void dfs(int x,int y) {
    for (int i = 0; i < 4; i++) {
        int xx = x + dx[i], yy = y + dy[i];
        if (xx <= 0 || xx > n || yy <= 0 || yy > m)
            continue;
        if (a[xx][yy] == 0) continue;
        if (check(xx, yy)) {
            a[xx][yy] = 0;
            ans++;
            dfs(xx, yy);
        }
    }
}
int main() {
    int _;
    scanf("%d", &_);
    while (_--) {
        scanf("%d%d%d", &n, &m, &q);
        for (int i = 0; i <= n + 1; i++) {
            for (int j = 0; j <= m + 1; j++) {
                a[i][j] = 1;
            }
        }
        while (q--) {
            ans=0;
            int x,y;
            scanf("%d%d", &x, &y);
            if (a[x][y] == 0) {
                printf("0\n");
                continue;
            }
            a[x][y] = 0;
            ans++;
            dfs(x, y);
            printf("%d\n", ans);
        }
    }
}
posted @ 2019-08-21 19:29  Snow_in_winer  阅读(149)  评论(0编辑  收藏  举报