The Preliminary Contest for ICPC Asia Nanjing 2019

The Preliminary Contest for ICPC Asia Nanjing 2019

Holy Grail 

#include <bits/stdc++.h>

using namespace std;
const int maxn=10000;
int n,m;
struct Spfa {
    struct Edge {
        int next, to, w;
    } e[maxn];
    int head[maxn], v[maxn], d[maxn], tol;
 
    void add(int u, int v, int w) {
        tol++;
        e[tol].to = v;
        e[tol].next = head[u];
        e[tol].w = w;
        head[u] = tol;
    }
 
    queue<int> q;
 
    int spfa(int s, int t) {
        memset(d, 0x3f, sizeof(d));
        memset(v, 0, sizeof(v));
        d[s] = 0;
        v[s] = 1;
        q.push(s);
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            v[x] = 0;
            for (int i = head[x]; i; i = e[i].next) {
                if (d[e[i].to] > d[x] + e[i].w) {
                    d[e[i].to] = d[x] + e[i].w;
                    if (v[e[i].to] == 0) {
                        v[e[i].to] = 1;
                        q.push(e[i].to);
                    }
                }
            }
        }
        return d[t] == 0x3f ? -1 : d[t];
    }
 
    void init() {
        memset(head, 0, sizeof(head));
        tol = 0;
    }
} S;
int main(){
    int _;
    scanf("%d",&_);
    while (_--){
        S.init();
        scanf("%d%d",&n,&m);
        for (int i=1,u,v,w;i<=m;i++){
            scanf("%d%d%d",&u,&v,&w);
            S.add(u,v,w);
        }
        for (int i=1,u,v;i<=6;i++){
            scanf("%d%d",&u,&v);
            int ans=S.spfa(v,u);
            printf("%d\n",-ans);
            S.add(u,v,-ans);
        }
    }
}

Greedy Sequence

#include <bits/stdc++.h>

using namespace std;
const int maxn=1e5+10;
int tot,t[maxn*30],ans[maxn],L[maxn*30],R[maxn*30],a[maxn],b[maxn],n,c[maxn],k;
vector<int>root;
int build(int l,int r) {
    int id = ++tot;
    t[id] = 0;
    if (l == r) return id;
    int mid = (l + r) >> 1;
    L[id] = build(l, mid);
    R[id] = build(mid + 1, r);
    return id;
}

void insert1(int id1,int x) {
    int id2 = ++tot;
    root.push_back(id2);
    t[id2] = t[id1] + 1;
    int l = 1, r = n;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (x <= mid) {
            r = mid;
            L[id2] = ++tot;
            R[id2] = R[id1];
            id2 = tot;
            id1 = L[id1];
        } else {
            l = mid + 1;
            R[id2] = ++tot;
            L[id2] = L[id1];
            id2 = tot;
            id1 = R[id1];
        }
        t[id2] = t[id1] + 1;
    }
}
int query1(int id,int l,int r,int x) {
    if (x >= a[r]) return t[id];
    else if (x < a[l]) return 0;
    int res = 0;
    int mid = (l + r) >> 1;
    if (x <= a[mid]) res = query1(L[id], l, mid, x);
    else {
        res += t[L[id]];
        res += query1(R[id], mid + 1, r, x);
    }
    return res;
}
int query(int l,int r,int LL,int RR,int k)
{
    if (l==r)
        return l;
    int mid=(l+r)>>1;
    int tmp=t[L[RR]]-t[L[LL]];
    if (k<=tmp)
    {
        return query(l,mid,L[LL],L[RR],k);
    }
    else
    {
        return query(mid+1,r,R[LL],R[RR],k-tmp);
    }
}
int main() {
    int _;
    scanf("%d", &_);
    while (_--) {
        tot =  0;
        scanf("%d%d", &n, &k);
        root.clear();
        for (int i = 1; i <= n; i++) {
            ans[i]=0;
            scanf("%d", &b[i]);
            a[i] = b[i];
            c[a[i]] = i;
        }
        sort(a + 1, a + 1 + n);
        n = unique(a + 1, a + n + 1) - (a + 1);
        root.push_back(build(1, n));
        for (int i = 1; i <= n; i++) {
            insert1(root[i - 1],b[i]);
        }
        for (int i = 1; i <= n; i++) {
            int id = c[i];
            while (1) {
                ans[i]++;
                int kk = query1(root[min(n, id + k)], 1, n, b[id]) - query1(root[max(1, id - k) - 1], 1, n, b[id]) - 1;
                if (kk == 0) break;
                id = c[a[query(1, n, root[max(1, id - k) - 1], root[min(n, id + k)], kk)]];
                if (ans[b[id]]) {
                    ans[i] += ans[b[id]];
                    break;
                }
            }
        }
        for (int i = 1; i <= n; i++) {
            if (i != n) printf("%d ", ans[i]); else printf("%d\n", ans[i]);
        }
    }
    return 0;
}

The beautiful values of the palace

 

猜你喜欢

转载自www.cnblogs.com/Accpted/p/11443084.html