2 条题解
-
0
by hansang:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=4e4+10; struct node{ LL x, y; node() {x=y=0;} } d[N]; struct at{int u, v; LL l; char s[5];} a[N]; struct qt{int u, v, k, id;} b[N]; node operator+(node n1, node n2){ n1.x+=n2.x; n1.y+=n2.y; return n1; } node operator-(node n1, node n2){ n1.x-=n2.x; n1.y-=n2.y; return n1; } bool cmp(qt q1, qt q2){ return q1.k<q2.k; } int fa[N]; LL ans[N]; bool v[N]; int findfa(int x){ if(fa[x]==x) return fa[x]; int f=fa[x]; int tx=findfa(fa[x]); d[x]=d[x]+d[f]; return fa[x]=tx; } void merge(int u, int v, LL l, char s[]){ int tx=findfa(u), ty=findfa(v); if(tx==ty) return ; fa[tx]=ty; node no; if(s[0]=='E') no.x=0, no.y=l; if(s[0]=='S') no.x=-l, no.y=0; if(s[0]=='W') no.x=0, no.y=-l; if(s[0]=='N') no.x=l, no.y=0; d[tx]=no-d[u]+d[v]; } int dis(node n1, node n2){ return abs(n1.x-n2.x)+abs(n1.y-n2.y); } int main(){ int n, q; scanf("%d%d", &n, &q); for(int i=1; i<=n; i++) fa[i]=i; for(int i=1; i<=q; i++){ scanf("%d%d%lld%s", &a[i].u, &a[i].v, &a[i].l, a[i].s); } int m; scanf("%d", &m); for(int i=1; i<=m; i++){ scanf("%d%d%d", &b[i].u, &b[i].v, &b[i].k); b[i].id=i; } sort(b+1, b+m+1, cmp); memset(v, 0, sizeof(v)); int now=0; for(int i=1; i<=m; i++){ while(now<=b[i].k) merge(a[now].u, a[now].v, a[now].l, a[now].s), now++; int tx=findfa(b[i].u), ty=findfa(b[i].v); if(tx!=ty){ ans[b[i].id]=-1; } else{ ans[b[i].id]=dis(d[b[i].u], d[b[i].v]); } } for(int k=1; k<=m; k++) printf("%lld\n", ans[k]); return 0; } -
0
by hansang:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=4e4+10; struct node{ LL x, y; node() {x=y=0;} } d[N]; struct at{int u, v; LL l; char s[5];} a[N]; struct qt{int u, v, k, id;} b[N]; node operator+(node n1, node n2){ n1.x+=n2.x; n1.y+=n2.y; return n1; } node operator-(node n1, node n2){ n1.x-=n2.x; n1.y-=n2.y; return n1; } bool cmp(qt q1, qt q2){ return q1.k<q2.k; } int fa[N]; LL ans[N]; bool v[N]; int findfa(int x){ if(fa[x]==x) return fa[x]; int f=fa[x]; int tx=findfa(fa[x]); d[x]=d[x]+d[f]; return fa[x]=tx; } void merge(int u, int v, LL l, char s[]){ int tx=findfa(u), ty=findfa(v); if(tx==ty) return ; fa[tx]=ty; node no; if(s[0]=='E') no.x=0, no.y=l; if(s[0]=='S') no.x=-l, no.y=0; if(s[0]=='W') no.x=0, no.y=-l; if(s[0]=='N') no.x=l, no.y=0; d[tx]=no-d[ u ]+d[v]; } int dis(node n1, node n2){ return abs(n1.x-n2.x)+abs(n1.y-n2.y); } int main(){ int n, q; scanf("%d%d", &n, &q); for(int i=1; i<=n; i++) fa[i]=i; for(int i=1; i<=q; i++){ scanf("%d%d%lld%s", &a[i].u, &a[i].v, &a[i].l, a[i].s); } int m; scanf("%d", &m); for(int i=1; i<=m; i++){ scanf("%d%d%d", &b[i].u, &b[i].v, &b[i].k); b[i].id=i; } sort(b+1, b+m+1, cmp); memset(v, 0, sizeof(v)); int now=0; for(int i=1; i<=m; i++){ while(now<=b[i].k) merge(a[now].u, a[now].v, a[now].l, a[now].s), now++; int tx=findfa(b[i].u), ty=findfa(b[i].v); if(tx!=ty){ ans[b[i].id]=-1; } else{ ans[b[i].id]=dis(d[b[i].u], d[b[i].v]); } } for(int k=1; k<=m; k++) printf("%lld\n", ans[k]); return 0; }
- 1
信息
- ID
- 2645
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 19
- 已通过
- 2
- 上传者