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


The Preliminary Contest for ICPC Asia Nanjing 2019
原文:https://www.cnblogs.com/Accpted/p/11443084.html