记录详情

Runtime Error


  
# 状态 耗时 内存占用
#1 Accepted 21ms 7.93 MiB
#2 Accepted 22ms 7.984 MiB
#3 Accepted 14ms 7.973 MiB
#4 Accepted 16ms 8.094 MiB
#5 Accepted 19ms 8.121 MiB
#6 Accepted 25ms 8.281 MiB
#7 Accepted 18ms 8.441 MiB
#8 Accepted 18ms 8.039 MiB
#9 Accepted 21ms 8.09 MiB
#10 Accepted 17ms 8.156 MiB
#11 Accepted 44ms 13.016 MiB
#12 Accepted 62ms 14.277 MiB
#13 Accepted 68ms 19.176 MiB
#14 Accepted 77ms 20.781 MiB
#15 Runtime Error 41ms 12.621 MiB
#16 Runtime Error 32ms 12.941 MiB
#17 Accepted 82ms 13.93 MiB
#18 Accepted 98ms 14.672 MiB
#19 Accepted 102ms 15.434 MiB
#20 Accepted 299ms 30.336 MiB

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2000010;
int last[maxn],dep[maxn],fa[maxn],siz[maxn],top[maxn];
int son[maxn],sum[maxn],dfn[maxn],W[maxn],c[maxn];
int n,m,cnt,tot;
struct Edge
{
  int to,nxt,val;
}a[maxn<<1];

struct data
{
  int s,t,d;
}t[maxn];

bool cmp(data a,data b)
{
  return a.d>b.d;
}

inline void Add(int x,int y,int val)
{
  a[++cnt].to=y;
  a[cnt].val=val;
  a[cnt].nxt=last[x];
  last[x]=cnt;
}

void dfs1(int x,int f)
{
  dfn[++tot]=x;
  dep[x]=dep[f]+1;
  fa[x]=f;
  siz[x]=1;
  int maxson=-1;
  for(int i=last[x];i;i=a[i].nxt)
  {
  	int y=a[i].to;
  	if(y==f) continue;
	sum[y]=sum[x]+a[i].val;
	W[y]=a[i].val;
	dfs1(y,x);
	siz[x]+=siz[y];
	if(siz[y]>maxson)
	  maxson=siz[y],son[x]=y; 
  }
}

void dfs2(int x,int topf)
{
  top[x]=topf;
  if(!son[x]) return;
  dfs2(son[x],topf);
  for(int i=last[x];i;i=a[i].nxt)
  {
  	int y=a[i].to;
  	if(y==fa[x] || y==son[x])
      continue;
    dfs2(y,y);
  }
}

int LCA(int x,int y)
{
  while(top[x]!=top[y])
  {
  	if(dep[top[x]]<dep[top[y]]) swap(x,y);
  	x=fa[top[x]];
  }
  if(dep[x]<dep[y]) return x;
  return y;
}

bool check(int mid)
{
  int cnt=0;
  if(t[1].d<=mid) return true;
  for(int i=1;i<=m;i++)
  {
  	if(t[i].d<=mid) break;
  	cnt++; 
  }
  memset(c,0,sizeof(c));
  for(int i=1;i<=cnt;i++)
    c[t[i].s]++,c[t[i].t]++,c[LCA(t[i].s,t[i].t)]-=2;
  for(int i=n;i>=2;i--)
    c[fa[dfn[i]]]+=c[dfn[i]];
  for(int i=2;i<=n;i++)
    if(c[i]==cnt)
      if(t[1].d-W[i]<=mid) return true;
  return false;
}

int main()
{
  int u,v,w,l=0,r=0;
  scanf("%d %d",&n,&m);
  for(int i=1;i<n;i++)
  {
  	scanf("%d %d %d",&u,&v,&w);
  	Add(u,v,w),Add(v,u,w);
  	r+=w;
  }
  dfs1(1,0);
  dfs2(1,1);
  for(int i=1;i<=m;i++)
  {
    scanf("%d %d",&t[i].s,&t[i].t);
    t[i].d=sum[t[i].s]+sum[t[i].t]-(sum[LCA(t[i].s,t[i].t)]<<1);
  }  
  sort(t+1,t+m+1,cmp); 
  while(l<=r)
  {
  	int mid=(l+r)>>1;
  	if(check(mid)) r=mid-1;
  	else l=mid+1; 
  }
  printf("%d\n",l);
  return 0;
}

信息

递交者
类型
递交
题目
P1057 运输计划
题目数据
下载
语言
C++
递交时间
2019-11-12 17:15:57
评测时间
2019-11-12 17:15:57
评测机
分数
90
总耗时
1107ms
峰值内存
30.336 MiB