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