首页 > 其他分享 >P8817 [CSP-S 2022] 假期计划

P8817 [CSP-S 2022] 假期计划

时间:2022-11-23 20:57:32浏览次数:38  
标签:P8817 ch ma read ll while 2022 ver CSP

[CSP-S 2022] 假期计划

我第一眼看的时候怎么搞都会多一个 \(O(\log n)\),还在想是不是有什么高深做法……

然后想到边权为 \(1\) 的时候好像根本不需要用 Dijkstra,直接 BFS 不就得了……

那么我们预处理出每个点之间的距离实际上是 \(O(n(n+m))\) 的。

剩下的事情就很简单了,我们针对每个点 \(x\),找到点权最大的三个点,这三个点满足条件:既可以到达 \(x\) 又可以到达源点。

然后我们枚举路程中间的两个点 \(B,C\),枚举比较一下就结束了。这一块的复杂度是 \(O(n^2)\) 的。

最后的时间复杂度就是 \(O(n(n+m))\) 的。

代码:

#include<iostream>
#include<cstdio>
#include<queue>
#define ll long long
using namespace std;
namespace Ehnaev{
  inline ll read() {
    ll ret=0,f=1;char ch=getchar();
    while(ch<48||ch>57) {if(ch==45) f=-f;ch=getchar();}
    while(ch>=48&&ch<=57) {ret=(ret<<3)+(ret<<1)+ch-48;ch=getchar();}
    return ret*f;
  }
  inline void write(ll x) {
    static char buf[22];static ll len=-1;
    if(x>=0) {do{buf[++len]=x%10+48;x/=10;}while(x);}
    else {putchar(45);do{buf[++len]=-(x%10)+48;x/=10;}while(x);}
    while(len>=0) putchar(buf[len--]);
  }
}using Ehnaev::read;using Ehnaev::write;

const ll inf=1e9,N=2.5e3,M=1e4;

ll n,m,k,tot,ans,u,v,h;
ll f[N+5][N+5],ver[M*2+5],nxt[M*2+5],head[N+5],a[N+5],ma[4][N+5];
bool vis[N+5];
queue<ll> q;

inline void Add(ll u,ll v) {ver[++tot]=v;nxt[tot]=head[u];head[u]=tot;}

int main() {
  
  n=read();m=read();k=read();
  for(ll i=2;i<=n;i++) {a[i]=read();}
  tot=1;
  for(ll i=1;i<=m;i++) {u=read();v=read();Add(u,v);Add(v,u);}
  
  for(ll j=1;j<=n;j++) {
    for(ll i=1;i<=n;i++) f[j][i]=inf;
    for(ll i=1;i<=n;i++) vis[i]=0;
    while(!q.empty()) q.pop();q.push(j);f[j][j]=0;vis[j]=1;
    while(!q.empty()) {
      h=q.front();q.pop();
      if(f[1][h]<=k+1&&f[j][h]<=k+1&&a[h]>0&&h!=j&&h!=1) {
        if(a[h]>=a[ma[1][j]]) {ma[3][j]=ma[2][j];ma[2][j]=ma[1][j];ma[1][j]=h;}
        else if(a[h]>=a[ma[2][j]]) {ma[3][j]=ma[2][j];ma[2][j]=h;}
        else if(a[h]>=a[ma[3][j]]) {ma[3][j]=h;}
      }
      if(f[j][h]>=k+1) continue;
      for(ll i=head[h];i;i=nxt[i]) {
        if(vis[ver[i]]) continue;vis[ver[i]]=1;
        f[j][ver[i]]=f[j][h]+1;q.push(ver[i]);
      }
    }
  }
  
  for(ll i=2;i<=n;i++) {
    for(ll j=2;j<=n;j++) {
      if(i==j) continue;
      if(f[i][j]<=k+1) {
        ll tmp=a[i]+a[j];ll flg=0;
        for(ll p=1;p<=3;p++) {
          if(ma[p][i]<=1) continue;
          if(ma[p][i]==j) continue;
          flg=ma[p][i];break;
        }
        if(!flg) continue;
        tmp+=a[flg];ll flgg=0;
        for(ll p=1;p<=3;p++) {
          if(ma[p][j]<=1) continue;
          if(ma[p][j]==i||ma[p][j]==flg) continue;
          flgg=ma[p][j];break;
        }
        if(!flgg) continue;
        tmp+=a[flgg];
//        printf("test:%lld %lld %lld %lld\n",flg,i,j,flgg);
        ans=max(tmp,ans);
      }
    }
  }
  
  write(ans);
  
  return 0;
}

标签:P8817,ch,ma,read,ll,while,2022,ver,CSP
From: https://www.cnblogs.com/Apolynth/p/16919746.html

相关文章

  • P8819 [CSP-S 2022] 星战
    [CSP-S2022]星战这么长时间过去都快不会写题解了。嗯……不过还是稍微记一下会比较好。题意看完之后就是让我们去判断整张图是否是一个内向基环树森林。然后这个事情......
  • 【2022-11-23】爬虫从入门到入狱(一)
    一、爬虫介绍#爬虫介绍: 网络爬虫(webcrawler)又称为网络蜘蛛(webspider)或网络机器人(webrobot),另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或蠕虫,同时它也是“物联......
  • 2022.11.23
    一说到清朝的闭关锁国,大家都很痛心疾首、愤愤不平,觉得要是没有闭关锁国的话,可能中国依然是强国,也能避免后来的那些耻辱了。但有意思的是,现在还是有很多人闭关锁国,他们对......
  • @tranctional +@feighclient 注解的一些细节2022-11-23
    rollbackfall  有异常,则回滚  该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚, 指定单一异常类:@Transactional(ro......
  • 2022 云原生编程挑战赛圆满收官,见证冠军战队的诞生
    11月3日,天池大赛·第三届云原生编程挑战赛在杭州云栖大会圆满收官。三大赛道18大战队手历经3个月激烈的角逐,终于交上了满意的答卷,同时也捧回了属于他们的荣耀奖杯。......
  • kali linux 2022.1版本root密码重置
    1、按e进入修复模式2、在linux行尾输入rwsingleinit=/bin/bash3、Ctrl+x进入命令行界面4、使用passwd命令修改root密码,完成后重启5、使用root用户登录6、重置成功......
  • 2022 卡塔尔世界杯视频直播 All In One
    2022卡塔尔世界杯视频直播AllInOne抖音https://www.douyin.com/fifaworldcuphttps://www.douyin.com/search/CCTV164K视频refs©xgqfrms2012-2021w......
  • 周六900C++班级-2022-11-19 01背包
    背包问题关系图  问题描述若有N件物品和一个最多能装重量为W的背包,一个物品只有两个属性:重量和价值。第i件物品的重量是weight[i],得到的价值是value[i]。假......
  • 第三届数字四川创新大赛(2022)“天空卫士杯”数据安全赛道决赛暨颁奖典礼成功举行
    2022年11月17日,由四川省大数据中心、省委网信办、省发展改革委、经济和信息化厅和省科协联合主办,北京天空卫士网络安全技术有限公司协办的第三届数字四川创新大赛(2022)数据安......
  • hgame2022 复现
    enterthepwnland​pthread_create()函数:创建线程intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void......