DescriptionDescriptionDescription

一个长度为nnn的序列,第iii个位置的人可以跳到[ai,i)[a_i,i)[ai​,i)的任何一个位置
在第[bi,i)[b_i,i)[bi​,i)位置的人可以跳到iii,设第iii个位置跳到第jjj个位置的最小步数为dist(i,j)dist(i,j)dist(i,j)
对于所有的i≠ji\neq ji​=j求dist(i,j)×(i+j)dist(i,j)\times (i+j)dist(i,j)×(i+j)的亦或和

数据范围:n≤6000n\leq 6000n≤6000


SolutionSolutionSolution

首先假设三个位置i<j<ki<j<ki<j<k

如果iii能跳到kkk,那么jjj也一定能跳到kkk
所以如果jjj要去kkk,它一定不会先去iii再去kkk,而是直接去kkk

所以最优方案一定是先往后跳若干步(可以不跳),再往前跳

  1. 于是我们设起点为iii时,往后跳到jjj的最小步数为dist[j]dist[j]dist[j]
    假设我们已经求好了跳到j−1j-1j−1的方案,现在要求跳到jjj的
    我们可以维护一个下标单调递增的单调栈,这样一来后面进来的一定是位置靠后的
    于是我们把不能跳到jjj的全部弹出去,找到最后一个可以跳到jjj的,并加上,此时栈的大小就是跳跃的最小步数dist[j]=topdist[j]=topdist[j]=top

由于我们的jjj是向后扫描的,所以一定满足单调性,这样做是O(n)O(n)O(n)的

  1. 接着求完了跳到后面的,我们开始求跳到前面的,也就是dist1∼i−1dist_{1\sim i-1}dist1∼i−1​这部分
    我们要知道一件事,从跳的步数尽量少的往前跳,先更新的一定更优
    所以我们把distj∈[i+1,n]dist_{j\in[i+1,n]}distj∈[i+1,n]​ 放入对应的vectorvectorvector,然后更新,这样一来先更新到的一定是更优的
    如果中途有更新,记得放进去,让其可以继续跳

用并查集维护一下没有被更新的点,由于每个点只会被最优的点更新到一次,所以往前跳的复杂度是O(nα(n))O(n\alpha(n))O(nα(n)),其中α(n)\alpha(n)α(n)可以看做常数

加上枚举的iii,总时间复杂度为O(n2)O(n^2)O(n2)


CodeCodeCode

#include<cstdio>
#include<cctype>
#include<vector>
using namespace std;int n,a[6010],b[6010],f[6100],dist[6010],st[6010],top,ans;
inline int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
vector<int>q[6010];
inline long long read()
{long long d=1,f=0;char c;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{n=read();a[1]=1;b[1]=1;for(register int i=2;i<=n;i++) a[i]=read();for(register int i=2;i<=n;i++) b[i]=read();for(register int i=1;i<=n;i++){for(register int j=0;j<=n;j++) {f[j]=j;dist[j]=n+1;//初始化并查集和distq[j].clear();}dist[i]=0;st[top=0]=i;q[0].push_back(i);//一开始从i开始跳for(register int j=i+1;j<=n;j++){while(top>0&&st[top-1]>=b[j]) top--;//如果前一个点可以跳到,那么把后面的点踢掉st[++top]=j;//放入新的点dist[j]=top;q[top].push_back(j);//把top步可以去到的点记录下来}for(register int j=0;j<=n;j++)//步数从小到大枚举for(register int k=0;k<q[j].size();k++)//找出点来for(register int l=find(q[j][k]-1);l>=a[q[j][k]];l=find(l-1))//往前更新{if(dist[l]>j+1) dist[l]=j+1,q[j+1].push_back(l);//注意此时j+1步可以跳到l,也要更新!f[l]=l-1;//连向前一个点表示这个点已经废了}for(register int j=1;j<=n;j++) if(i!=j) ans^=(i+j)*dist[j];//计算答案}printf("%d\n",ans);
}

nssl 1454 2018CodeM总决赛 最短路相关推荐

  1. nssl 1452 2018CodeM总决赛 排行榜

    DescriptionDescriptionDescription 有一种长度为2n2n2n的序列,它有nnn种数字,每种数字恰好出现两次,假设开头的那个数字为xxx,xxx第二次出现的位置为iii, ...

  2. 关于第十六届智能车竞赛全国总决赛比赛意见

    简 介: 第十六届全国大学生全国大学生智能车竞赛在进行完毕分赛区比赛之后,时间到了2021年8月份,现在全国疫情出现了反复使得全国总决赛的承办出现了困难.为此,参加比赛的队伍在TSINGHUAZHUO ...

  3. [C] [最短路] 只有5行的算法:Floyd-Warshall

    终于学到求最短路了,终于来到我最喜欢的算法--Floyd-Warshall了!今天还有点小激动呢! 我喜欢它,当然是因为它逻辑十分简单咯!真的只有5行诶! Floyd-Warshall算法 题目描述 ...

  4. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  5. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  6. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  7. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  8. E:By Elevator or Stairs? CF595 DP最短路

    题目链接 比赛的时候一看,这不是最短路吗,然后敲了一个最短路. 然后比赛完发现大家基本都写的dp,我真是个憨憨,dp3行 最短路就建个简单的图,dp就是从上一维转化过来就是了 优秀的dp: //#pr ...

  9. The Shortest Statement CodeForces - 1051F LCA+最短路

    太弱了... 一开始看到题感觉是跑一个最小生成树在上边进行LCA就行了,但是发现过不了样例,然后就是就想到了之前做过类似做法的题目,就是非生成树上的边最多只有21条,然后就那些边记录下来,通过每一条边 ...

最新文章

  1. 【控制】《鲁棒控制》-周克敏老师
  2. weblogic oracle连接池配置文件,关于WebLogic 访问Oracle 数据库(建立连接池)问题...
  3. Python编程基础:第三十三节 文件复制Copy a File
  4. jq添加新节点赋予class属性并获取该对象
  5. 电气:6机30节点经济调度(考虑负荷平衡、线路容量、斜坡约束)代码实现
  6. [入门]理想的小白程序员成长曲线
  7. Kafka : kafka errors.DisconnectException: null
  8. Recycle网格制式之瀑布流的实现
  9. 2021-2025年中国电影发行行业市场供需与战略研究报告
  10. 超方便的开源视频下载工具
  11. 修改键盘映射、交换按键
  12. 管理是管事,领导是带人!
  13. 梧桐树金玉满堂增额终身寿险将下架,百度开屏也懂我的资产荒焦虑
  14. ImportError: cannot import name ‘structural_similarity‘ from ‘skimage.measure‘
  15. Excel2010数据透视表1
  16. 做个男人,做个成熟的男人,做个有城府的男人
  17. 成功解决raise AssertionError(“Torch not compiled with CUDA enabled“)AssertionError: Torch not compiled
  18. Macbook忘记密码的解决方法
  19. 集成电路工艺基础介绍以及什么是Corner?
  20. springboot采用协同过滤算法的视频推荐系统的设计与实现毕业设计源码261620

热门文章

  1. 开放鸿蒙,未来可循:一文读懂华为开发者大会2021主题演讲
  2. 【博学谷学习记录】超强总结,用心分享|狂野架构师之比较常用的技术栈整合
  3. “三网融合”的过去、现在与未来
  4. 怎样在计算机里恢复云文档图标,电脑常识科普:Win10资源管理器中的WPS云文档图标怎么彻底删除...
  5. MVG读书笔记——单应矩阵估计这件小事(一)
  6. 大数据在金融领域的应用案例解析
  7. python123 凯撒密码,Python:Caesar代码,python,凯撒,密码
  8. PC客户端软件的安装和卸载测试知识点
  9. wetool个人版_wetoo群发wetool与企业-购买
  10. Could not resolve placeholder 'jdbc username' in string valu