首页 > 其他分享 >运输计划

运输计划

时间:2024-05-21 11:12:20浏览次数:10  
标签:运输 ch int 任务 枚举 计划 ans quad

$\quad $ 最好想的就是枚举每一条边(其实边权下放后就是点),然后将这条边删去,再遍历一遍运输任务,算出新的用时更新答案即可。

$\quad $ 然后你就会发现 \(T\) 了,那么我们就可以来看看优化手段了。

$\quad $ 首先你要枚举删去的边一定在未删边时用时最长的运输任务所覆盖的边中,如果不删去这些边中的一条,对最大值就没有影响,显然不会成为答案(当然只是这样还是会TLE)。

$\quad $ 然后就可以对运输任务按照用时多少进行排序,从大到小依次枚举。如果发现删完这条边后对此任务用时没影响,就可以停止枚举,与上一条类似,如果对这个运输任务没影响,那么后面的运输任务用时一定小于该运输任务,后边的运输任务就不可能成为最大值。还有,如果删去此边后,该任务用时少于下一个枚举任务未删边时的用时,也可以停止枚举,原理和上面相同。

$\quad $ 到现在,非Hack点应该就过了。但是昨天 \(qinyun\) 也是出了个数据把我卡费了,问了一下发现有许多相同的任务,就直接拿map去了一下重也是直接过了。

$\quad $ 另外还有一个小优化,因为该题是一个不带修线段树区间求和,直接拿前缀和处理即可,因为dfn值都是连续的,所以以dfn值求前缀和即可。

看看用时

  #include<bits/stdc++.h>
  using namespace std;
  const int N=3e5+100;
  #define ld (x<<1)
  #define rd (x<<1|1)
  map<int,bool>mp[N];
  struct stu{
  	int l,r,sum,ma;
  }s[N<<2];
  int dfn[N],dep[N],fa[N],top[N],to[N<<1],nt[N<<1],h[N],cnt,tot;
  int n,m,size[N],son[N],rnk[N],a[N],w[N<<1],qz[N];
  vector<int>path;
  void add(int x,int y,int z){
  	to[++tot]=y;
  	w[tot]=z;
  	nt[tot]=h[x];
  	h[x]=tot;
  }
  int read(){
  	int ans=0;bool f=0;char ch=getchar();
  	while(ch<'0' || ch>'9'){if(ch=='-')f=1;ch=getchar();}
  	while(ch>='0' && ch<='9'){ans=(ans<<1)+(ans<<3)+(ch^48);ch=getchar();}
  	return f?~ans+1:ans;
  }
  void push_up(int x){s[x].sum=s[ld].sum+s[rd].sum;}
  void dfs1(int x){
      size[x]=1;
      son[x]=-1;
      for(int i=h[x];i;i=nt[i]){
          int y=to[i];
          if(!dep[y]){
              dep[y]=dep[x]+1;
              fa[y]=x;
              a[y]=w[i];
              dfs1(y);
              size[x]+=size[y];
              if(son[x]==-1||size[y]>size[son[x]])son[x]=y;
          }
      }
  }
  void dfs2(int x,int t){
      top[x]=t;
      dfn[x]=++cnt;
      rnk[cnt]=x;
      if(son[x]==-1)return;
      dfs2(son[x],t);
      for(int i=h[x];i;i=nt[i]){
          int y=to[i];
          if((y^son[x])&&(y^fa[x]))dfs2(y,y);
      }
  }
  int ask(int x,int y,int fla){
  	int ans=0;
  	while(top[x]^top[y]){
  		if(dep[top[x]]<dep[top[y]])swap(x,y);
  		if(dfn[top[x]]<=fla&&fla<=dfn[x])ans+=qz[dfn[x]]-qz[dfn[top[x]]-1]-a[rnk[fla]];
  		else ans+=qz[dfn[x]]-qz[dfn[top[x]]-1];
  		x=fa[top[x]];
  	}
  	if(dep[x]>dep[y])swap(x,y);
  	if(dfn[x]+1<=fla&&fla<=dfn[y])ans+=qz[dfn[y]]-qz[dfn[x]]-a[rnk[fla]];
  	else ans+=qz[dfn[y]]-qz[dfn[x]];
  	return ans;
  }
  void ask_path(int x,int y){
  	while(top[x]^top[y]){
  		if(dep[top[x]]<dep[top[y]])swap(x,y);
  		for(int i=dfn[top[x]];i<=dfn[x];i++)path.push_back(i);
  		x=fa[top[x]];
  	}
  	if(dep[x]>dep[y])swap(x,y);
  	for(int i=dfn[x];i<=dfn[y];i++)path.push_back(i);
  }
  struct sta{
  	int id,m,x,y;
  	bool operator<(const sta a)const{
  		return m<a.m;
  	}
  }op[N];
  int total=0;
  int main(){
  	n=read(),m=read();
  	for(int i=1;i<n;i++){
  		int x=read(),y=read(),z=read();
  		add(x,y,z);
  		add(y,x,z);
  	}
  	dep[1]=1;
  	dfs1(1);
  	dfs2(1,1);
  	for(int i=1;i<=n;i++)qz[i]=qz[i-1]+a[rnk[i]];
  	for(int i=1;i<=m;i++){
  		int x=read(),y=read();
  		if(mp[x][y]||mp[y][x])continue;
  		mp[x][y]=mp[y][x]=1;
  		op[++total]={i,ask(x,y,0),x,y};
  	}
  	sort(op+1,op+1+total);
  	int x=op[total].x,y=op[total].y;
  	ask_path(x,y);
  	int ans=-1e9,ansl=1e9;
  	for(auto i:path){
  		for(int j=total;j>=1;j--){
  			int w=ask(op[j].x,op[j].y,i);
  			ans=max(ans,w);
  			if(w==op[j].m||(j>1&&w>=op[j-1].m))break;
  		}
  		ansl=min(ansl,ans);
  		ans=0;
  	}
  	printf("%d",ansl);
  }

求Hack

标签:运输,ch,int,任务,枚举,计划,ans,quad
From: https://www.cnblogs.com/0shadow0/p/18203531

相关文章

  • 运输计划
    [NOIP2015提高组]运输计划题目背景NOIP2015Day2T3题目描述公元\(2044\)年,人类进入了宇宙纪元。L国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星球之间,这\(n-1\)条航道连通了L国的所有星球。小P掌管一家物流公司,该公司有很多个运输计划,每个运输......
  • 测试计划与测试内容的区别
    测试方案、测试计划、测试策略与测试用例之间的区别?测试方案:测试工具的设计和选择,测试用例的设计方法,测试代码的设计方案。测试方案需要在测试计划的指导下进行,测试计划提出“做什么”,而测试方案明确“如何做“。一个行动方案,一个偏执行。测试计划:1、对测试全过程的组织、资......
  • 存钱计划(三)
    存钱计划(三)时间限制(普通/Java):1000MS/30000MS内存限制:65536KByte描述TZC的店铺比较多,上次WY随便走只要能走到就行,现在他学聪明了。WY去买东西的话,确定一家店以后,当然他先要想想怎么样走到那家店走的路最少。店与店之间是有走的方向的,从店A到店B可以,店B到店A未必可以。店与......
  • 使用django_celery_beat在admin后台配置计划任务
    使用步骤安装包pipinstalldjango-celery-beatapp注册app注册INSTALLED_APPS=[....'django_celery_beat',]配置文件:屏蔽原来的调度器CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers.DatabaseScheduler'设置时区LANGUAGE_CODE='z......
  • 第12周]比较不同团队的绩效评估方法;提出自己团队的绩效评估计划
    针对我的团队制定的绩效评估计划包括:1.目标设定阶段:与每位团队成员一对一会谈,讨论和确认接下来一个时间段的SMART目标或OKRs。确保目标与公司的整体战略一致。2.中期检查:在目标期限的中间阶段,举行简短会议,检查每位成员的进度。这是调整目标、解决问题和提供支持的机会。中期检......
  • 比较不同团队的绩效评估方法;提出自己团队的绩效评估计划在学习通提交解答的同时,可以
    ]比较不同团队的绩效评估方法;提出自己团队的绩效评估计划在学习通提交解答的同时,可以同步发布在团队和个人博客上,作为学习心得体会,记录下来【第二组】答:不同团队的绩效评估方法会因公司文化、业务需求和团队特点而有所不同。以下是一些常见的团队绩效评估方法,以及可能适用于你......
  • 超简洁的todolist工具,电脑桌面高效计划管理软件
    对于上班族来说,在电脑上使用一款高效计划管理软件至关重要。这样的工具不仅能帮助我们清晰地规划和追踪工作任务,还能有效提高工作效率,减少遗漏和延误。例如,当我们面临多个项目并行时,通过管理软件可以一目了然地查看各项任务的进度和优先级,从而合理分配时间和精力。那么,哪款电脑桌......
  • 加固计划书
    加固计划书SDL介绍安全开发生命周期(SDL)是一种软件开发方法论,旨在通过将安全性纳入软件开发的各个阶段来创建更安全、更健壮的软件。SDL由一系列阶段和活动组成,涵盖了从需求分析到维护的整个软件开发生命周期。以下是SDL的主要阶段和相关活动:需求分析阶段:安全需求收集:确定......
  • 计划做点事情-跳槽
    【最近想做什么了】最近想跳槽了【为什么要做这个】现在的待遇有点低,或者说是太低了,想起来就觉得惨,难受,羞愧;目前看,在当前公司没有发展前景,升级调薪机会不大,也太慢了;转岗OD要再等一年多,而且,政策千变万化,到时候大概率就不满足要求了,也可能拿不到什么好待遇;通勤辛苦,地铁久,开车......
  • SQLServer统计监控SQL执行计划突变的方法
    使用动态管理视图(DMVs)来检测SQL执行计划的突变,你需要关注那些能够提供查询执行统计和计划信息的视图。以下是一些可以用于此目的的DMVs以及相应的查询示例:sys.dm_exec_query_stats:这个视图提供了关于SQLServer中查询执行的统计信息,包括CPU时间、总工作时间、执行次数等。SEL......